Aggiungi una nuova colonna con vincolo di chiave esterna in un comando


128

Sto cercando di aggiungere una nuova colonna che sarà una chiave esterna. Sono stato in grado di aggiungere la colonna e il vincolo di chiave esterna utilizzando due ALTER TABLEcomandi separati :

ALTER TABLE one
ADD two_id integer;

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

C'è un modo per farlo con un comando ALTER TABLE anziché due? Non sono riuscito a trovare nulla che funzioni.


Risposte:


185

Come spesso accade con la domanda relativa a SQL, dipende dal DBMS. Alcuni DBMS consentono di combinare le operazioni della tabella ALTER separate da virgole. Per esempio...

Sintassi Informix :

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

La sintassi per IBM DB2 LUW è simile, ripetendo la parola chiave ADD ma (se ho letto correttamente il diagramma) non richiede una virgola per separare gli elementi aggiunti.

Sintassi di Microsoft SQL Server :

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

Alcuni altri non consentono di combinare operazioni ALTER TABLE in questo modo. SQL standard consente una sola operazione nell'istruzione ALTER TABLE, quindi in SQL standard deve essere eseguito in due passaggi.


5
Secondo Aggiungi e vincolo.
Imran,

18
Per la parte SQL, per dare un nome al vincolo, lo si scrive in questo modo: ALTER TABLE [Messaggi] ADD [AlertTriggerID] BIGINT NULL, CONSTRAINT FK_Messages_AlertTriggers FOREIGN KEY (AlertTriggerID) REFERENCES AlertTriggers (AlertTriggerID);
Dragos Durlut,

78

In MS-SQLServer:

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

per quale motore DB è questo?
Knocte,

@knocte è per ms sql server - la domanda è ora taggata per chiarire che
sqladmin

Non penso che la domanda debba essere chiarita, poiché la risposta accettata afferma già che c'è una grande differenza tra i motori DB nel come farlo, ciò che deve essere chiarito è la tua risposta, quindi l'ho appena fatto
knocte

9
Per nominare il tuo vincolo. La risposta accettata consente al sistema di generare il nome, che è icky e difficile da gestire in seguito.
Derpy,

17

Per SQL Server dovrebbe essere qualcosa del genere

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

1
Questo è un po 'più conciso rispetto alle altre risposte.
Sam,

11

In MS SQL SERVER:

Con nome chiave esterna definito dall'utente

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

Senza nome chiave esterna definito dall'utente

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

3

In Oracle :

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

2

Aggiornamento 2020

È una domanda piuttosto vecchia, ma la gente ci sta ancora tornando. Nel caso in cui le risposte di cui sopra non ti siano state utili, assicurati di utilizzare lo stesso tipo di dati per la nuova colonna dell'ID dell'altra tabella.

Nel mio caso, stavo usando Laravel e utilizzo "numero intero senza segno" per tutti i miei ID in quanto non ha senso avere un ID LOL negativo.

Pertanto, la query SQL non elaborata cambierà in questo modo:

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

spero possa essere d'aiuto


1
"AGGIUNGI VINCITORE" dovrebbe essere semplicemente "VINCITORE", sì?
TimH,

1

Puoi farlo come di seguito in 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

Per DB2, la sintassi è:

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

0

Se è necessario aggiungere anche valori predefiniti nel caso in cui siano già presenti alcune righe nella tabella, aggiungere DEFAULT val

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

0

Prova questo:

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

1
Benvenuti in SO! Per favore, commenta le tue risposte quando sono solo codice. Nel tuo caso, ci sono molte risposte abbastanza simili alle tue, quindi esponi i tuoi vantaggi.
David García Bodego,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.