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.

cogumelo
fonte

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.

Jonathan Leffler
fonte
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)
sqladmin
fonte
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)
jausel
fonte
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);
Sandeep Badikolu
fonte
3

No Oracle :

ALTER TABLE one ADD two_id INTEGER CONSTRAINT Fk_two_id REFERENCES two(id);
O.Badr
fonte
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

Aprendiz
fonte
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)
user2010014
fonte
1

DLL do PostgreSQL para adicionar uma coluna FK:

ALTER TABLE one
ADD two_id INTEGER REFERENCES two;
Kshitij Bajracharya
fonte
1

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

Arsman Ahmad
fonte
1

Para o DB2, a sintaxe é:

ALTER TABLE one ADD two_id INTEGER FOREIGN KEY (two_id) REFERENCES two (id);
Dan B.
fonte
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);
iMalek
fonte
0

Tente o seguinte:

ALTER TABLE product
ADD FOREIGN KEY (product_ID) REFERENCES product(product_ID);
Michael Alavanyo
fonte
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