Database
 sql >> Base de Dados >  >> RDS >> Database

SQL ALTER TABLE para iniciantes


Em SQL, o ALTER TABLE instrução modifica a definição de uma tabela existente.

Você pode usar ALTER TABLE para alterar, adicionar ou eliminar colunas e restrições.

Dependendo do seu DBMS, o ALTER TABLE A instrução também pode ser usada para reatribuir e reconstruir partições ou desabilitar e habilitar restrições e gatilhos.

Sintaxe


A ALTER TABLE declaração geralmente é assim:
ALTER TABLE table_name
    [alter_option [, alter_option] ...]
    [partition_options]

Onde:
  • table_name é o nome da tabela que você deseja alterar.
  • [alter_option [, alter_option] …] é uma lista das alterações específicas que deseja fazer (por exemplo ADD seguido pelo nome e definição da coluna ou DROP COLUMN seguido pelo nome da coluna, etc).
  • [partition_options] é uma lista opcional de opções especificamente para tabelas particionadas. Nem todos os DBMSs suportam tabelas particionadas. Se o seu tiver, essas opções podem permitir que você adicione, elimine, descarte, importe, mescle ou divida partições, ou execute a manutenção do particionamento.

A sintaxe completa para ALTER TABLE pode ser bastante complexo e varia significativamente entre SGBDs. Para qualquer coisa não abordada neste artigo, consulte a documentação do DBMS.

Abaixo estão exemplos das ALTER TABLE mais comuns operações.

Adicionar uma nova coluna


Para adicionar uma nova coluna a uma tabela, use o ADD cláusula, seguida do nome da coluna e do tipo de dados.
ALTER TABLE Products 
ADD ProductDescription varchar(500);

Isso adiciona uma nova coluna chamada ProductDescription para os Products tabela.

Neste exemplo, tornamos a coluna um varchar(500) mas você usaria qualquer tipo de dados apropriado para sua nova coluna.

Você também pode incluir restrições em sua definição de coluna, mas isso pode depender do seu DBMS e se a tabela já contém dados ou não (veja a discussão abaixo sobre isso).

Renomear uma coluna


A maioria dos principais RDBMSs (PostgreSQL, Oracle, SQLite, MySQL 8.0+, MariaDB 10.5.2+) permite renomear uma coluna como esta:
ALTER TABLE table_name 
RENAME COLUMN column_name TO new_column_name;

Se você estiver usando o MySQL anterior à versão 8.0 ou o MariaDB anterior à versão 10.5.2+, será necessário usar a CHANGE COLUMN em vez disso, que também exige que você especifique novamente o tipo de dados. Assim:
ALTER TABLE table_name
CHANGE COLUMN old_column_name new_column_name datatype;

No SQL Server, você precisará usar o sp_rename procedimento armazenado para renomear uma coluna. Assim:
EXEC sp_rename 'schema_name.table_name.column_name', 'new_column_name', 'COLUMN';

Soltar uma coluna


Para descartar uma coluna, use o DROP COLUMN cláusula, seguida pelo nome da coluna.
ALTER TABLE table_name 
DROP COLUMN column_name;

Modificar a definição de uma coluna


A sintaxe para modificar a definição de uma coluna existente varia significativamente entre DBMSs. Também depende de quais modificações você precisa fazer.

Para simplificar, vamos fazer uma modificação simples em uma coluna no SQL Server:
ALTER TABLE Products 
ALTER COLUMN ProductDescription varchar(1000);

Neste exemplo, alteramos o ProductDescription coluna de varchar(500) para varchar(1000) .

Veja a seguir a sintaxe básica exigida por cada DBMS para fazer as mesmas alterações ou alterações semelhantes.

Servidor SQL:
ALTER TABLE table_name 
ALTER COLUMN column_name datatype;

PostgreSQL:
ALTER TABLE table_name 
ALTER COLUMN column_name TYPE datatype;

MySQL, MariaDB e Oracle antes de 10g:
ALTER TABLE table_name 
MODIFY COLUMN column_name datatype;

No Oracle 10g e posterior:
ALTER TABLE table_name 
MODIFY column_name datatype;

O SQLite não permitirá que você modifique uma coluna, exceto renomeá-la.

A sintaxe real de cada DBMS é geralmente muito mais complexa do que isso e depende exatamente do que você está tentando fazer. No entanto, isso deve começar com as modificações básicas da coluna.

Restrições e Considerações


Em geral, você deve evitar fazer modificações nas tabelas uma vez que elas contenham dados. Ao fazer alterações, você corre o risco de perder os dados existentes.

Dito isso, muitos SGBDs na verdade impedem que você faça certas alterações quando uma tabela contém dados. Por exemplo, você pode descobrir que não pode adicionar um NOT NULL restrição a uma coluna que contém dados.

Alguns DBMSs podem permitir que você faça isso, desde que você use um DEFAULT restrição (para fornecer um valor padrão para colunas que não tiveram dados explicitamente inseridos nelas), ou uma coluna de identidade/incremento automático ou uma coluna de carimbo de data/hora etc.

Alguns DBMSs não permitem que você descarte ou altere colunas em uma tabela.

Além disso, alguns DBMSs restringem os tipos de dados que podem ser adicionados.

Exemplo – Adicionando uma restrição NOT NULL


Aqui está um exemplo para ajudar a demonstrar os pontos acima.

Aqui está o que acontece quando tento adicionar uma coluna com um NOT NULL restrição no SQL Server.
ALTER TABLE Products 
ADD ProductDescription varchar(500) NOT NULL;

Resultado:
Msg 4901, Level 16, State 1, Line 1
ALTER TABLE only allows columns to be added that can contain nulls, or have a DEFAULT definition specified, or the column being added is an identity or timestamp column, or alternatively if none of the previous conditions are satisfied the table must be empty to allow addition of this column. Column 'ProductDescription' cannot be added to non-empty table 'Products' because it does not satisfy these conditions.

Basicamente, a tabela já contém dados e, portanto, o SQL Server retorna um erro que me diz que só posso adicionar um NOT NULL restrição se a tabela satisfizer determinados critérios e ainda não atender a esses critérios.

E há uma boa razão para esse critério.

Um NOT NULL restrição garante que não haja NULL valores na coluna em qualquer linha. O problema é que já temos dados na tabela e, se adicionarmos uma nova coluna, essas linhas existentes serão NULL – que violará imediatamente nosso NOT NULL limitação. Portanto, precisamos especificar os dados para entrar nas linhas existentes.

Para fazer isso, podemos adicionar um DEFAULT restrição ou similar para garantir que todas as linhas existentes sejam preenchidas automaticamente com dados nesta coluna.

Exemplo:
ALTER TABLE Products 
ADD ProductDescription varchar(500) NOT NULL DEFAULT 'N/A';

Isso simplesmente adiciona um DEFAULT restrição da coluna. Essa restrição garante que todas as linhas contenham um valor (neste caso, o valor é N/A ) se eles não tiverem recebido um valor. Isso significa que nosso NOT NULL restrição não será violada, porque todas as linhas existentes agora conterão um valor.

Se a nova coluna precisar ter valores incrementais exclusivos, você poderá torná-la uma IDENTITY coluna (ou AUTOINCREMENT em SQLite e outros SGBDs).

No entanto, se a tabela ainda não contiver dados, você poderá adicionar a coluna sem precisar executar nenhuma dessas etapas.

Opções de partição


Este artigo é voltado para iniciantes, e as tabelas particionadas estão um pouco fora do domínio do tutorial para iniciantes.

Dito isso, vou examinar rapidamente algumas das opções de particionamento em relação ao ALTER TABLE demonstração.

Se o seu DBMS suporta tabelas particionadas, provavelmente também fornece opções de partição com o ALTER TABLE demonstração.

Por exemplo, no MySQL você pode fazer o seguinte:
ALTER TABLE Products
PARTITION BY HASH(ProductId)
PARTITIONS 8;

Isso particiona a tabela em 8 partições, por HASH , usando o ProductId coluna como a chave de particionamento.

PARTITION BY HASH usa o restante da expressão (neste caso, o ProductId coluna) dividido pelo número de partições (ou seja, o módulo).

Você também pode usar partições de intervalo. Veja como você pode adicionar uma partição de intervalo a uma tabela existente:
ALTER TABLE Products 
ADD PARTITION (PARTITION Partition9 VALUES LESS THAN (2020));

Este exemplo implica que os Products table já tem 8 partições de intervalo e estamos adicionando outra partição chamada Partition9 .

Você pode soltar partições assim:
ALTER TABLE Products 
DROP PARTITION Partition8, Partition9;

Tenha em mente que estes exemplos são para MySQL.

Também escrevi alguns artigos sobre tabelas particionadas no SQL Server. Com relação ao ALTER TABLE instrução, aqui está como mudar uma partição e aqui está como mudar em uma partição (ambos são feitos com ALTER TABLE ).

No SQL Server, algumas opções de partição precisam ser feitas com outras instruções. Por exemplo, a mesclagem de partições é feita com a ALTER PARTITION FUNCTION e a divisão de partições é feita com o ALTER PARTITION SCHEME demonstração.

Se você quiser saber mais sobre tabelas particionadas no SQL Server, veja como criar uma tabela particionada no SQL Server.

ALTER TABLE em SQLite


Devo também mencionar que o SQLite tem um suporte muito limitado do ALTER TABLE demonstração. No SQLite, o ALTER TABLE A instrução permite renomear uma tabela, renomear uma coluna em uma tabela ou adicionar uma nova coluna a uma tabela existente.

Quaisquer outras alterações exigirão que você abandone a tabela e comece novamente. Isso também se aplica à adição de chaves estrangeiras.