Adicionar nova coluna com restrição de chave estrangeira em um comando


128

Estou tentando adicionar uma nova coluna que será uma chave estrangeira. Consegui adicionar a coluna e a restrição de chave estrangeira usando dois ALTER TABLEcomandos separados :

ALTER TABLE one
ADD two_id integer;

ALTER TABLE one
ADD FOREIGN KEY (two_id) REFERENCES two(id);

Existe uma maneira de fazer isso com um comando ALTER TABLE em vez de dois? Eu não conseguia pensar em nada que funcionasse.


Respostas:


185

Como tantas vezes com perguntas relacionadas ao SQL, isso depende do DBMS. Alguns DBMS permitem combinar operações da tabela ALTER separadas por vírgulas. Por exemplo...

Sintaxe do Informix :

ALTER TABLE one
    ADD two_id INTEGER,
    ADD CONSTRAINT FOREIGN KEY(two_id) REFERENCES two(id);

A sintaxe do IBM DB2 LUW é semelhante, repetindo a palavra-chave ADD, mas (se eu ler o diagrama corretamente) não requer vírgula para separar os itens adicionados.

Sintaxe do Microsoft SQL Server :

ALTER TABLE one
    ADD two_id INTEGER,
    FOREIGN KEY(two_id) REFERENCES two(id);

Alguns outros não permitem combinar operações ALTER TABLE dessa maneira. O SQL padrão permite apenas uma única operação na instrução ALTER TABLE; portanto, no SQL padrão, isso deve ser feito em duas etapas.


5
Segundo Adicionar e restrição.
Imran

18
Para a parte SQL, para dar um nome à restrição, você a escreve da seguinte maneira: ALTER TABLE [Mensagens] ADD [AlertTriggerID] BIGINT NULL, CONSTRAINT FK_Messages_AlertTriggers FOREIGN KEY (AlertTriggerID) REFERÊNCIAS AlertTriggers (AlertTriggerID);
Dragos Durlut

78

No MS-SQLServer:

ALTER TABLE one
ADD two_id integer CONSTRAINT fk FOREIGN KEY (two_id) REFERENCES two(id)

para qual mecanismo de banco de dados é esse?
knocte

@knocte é para servidor MS SQL - questão está agora marcado para esclarecer que
sqladmin

Eu não acho que a questão necessidades de esclarecimento, como a resposta aceita já afirma que há uma grande diferença entre os motores DB em como fazê-lo, o que precisa ser esclarecido é a sua resposta, então eu só fiz isso
knocte

9
Pronto para nomear sua restrição. A resposta aceita permite que o sistema gere o nome, que é difícil e difícil de gerenciar posteriormente.
Derpy 26/05

17

Para o SQL Server, deve ser algo como

ALTER TABLE one
ADD two_id integer constraint fk foreign key references two(id)

1
Isso é um pouco mais conciso do que as outras respostas.
Sam

11

No MS SQL SERVER:

Com nome de chave estrangeira definido pelo usuário

ALTER TABLE tableName
ADD columnName dataType,
CONSTRAINT fkName FOREIGN KEY(fkColumnName) 
   REFERENCES pkTableName(pkTableColumnName);

Sem nome de chave estrangeira definido pelo usuário

ALTER TABLE tableName
ADD columnName dataType,
FOREIGN KEY(fkColumnName) REFERENCES pkTableName(pkTableColumnName);

3

No Oracle :

ALTER TABLE one ADD two_id INTEGER CONSTRAINT Fk_two_id REFERENCES two(id);

2

Atualização 2020

É uma pergunta bastante antiga, mas as pessoas ainda estão voltando a ela, eu vejo. Caso as respostas acima não tenham ajudado, verifique se você está usando o mesmo tipo de dados para a nova coluna que o ID da outra tabela.

No meu caso, eu estava usando o Laravel e uso "número inteiro não assinado" para todos os meus IDs, pois não há sentido em ter um ID LOL negativo.

Portanto, para isso, a consulta SQL bruta mudará assim:

ALTER TABLE `table_name`
ADD `column_name` INTEGER UNSIGNED,
ADD CONSTRAINT constrain_name FOREIGN KEY(column_name) REFERENCES foreign_table_name(id);

Espero que ajude


1
"ADICIONAR RESTRIÇÃO" deve ser apenas "RESTRIÇÃO", sim?
TimH 8/01/19

1

Você pode fazê-lo como abaixo no SQL Server

ALTER TABLE one
ADD two_id int foreign key
REFERENCES two(id)


1

ALTER TABLE TableName ADD NewColumnName INTEGER, FOREIGN KEY(NewColumnName) REFERENCES [ForeignKey_TableName](Foreign_Key_Column)


1

Para o DB2, a sintaxe é:

ALTER TABLE one ADD two_id INTEGER FOREIGN KEY (two_id) REFERENCES two (id);

0

Se você também precisa adicionar valores padrão no caso de você já tem algumas linhas na tabela, em seguida, adicionar PADRÃO val

ALTER TABLE one
ADD two_id int DEFAULT 123,
FOREIGN KEY(two_id) REFERENCES two(id);

0

Tente o seguinte:

ALTER TABLE product
ADD FOREIGN KEY (product_ID) REFERENCES product(product_ID);

1
Bem-vindo ao SO! Por favor, comente suas respostas quando forem apenas código. No seu caso, há muitas respostas bastante semelhantes às suas, portanto exponha seus benefícios.
David García Bodego
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.