Fügen Sie in einem Befehl eine neue Spalte mit Fremdschlüsseleinschränkung hinzu

128

Ich versuche, eine neue Spalte hinzuzufügen, die ein Fremdschlüssel sein wird. Ich konnte die Spalte und die Fremdschlüsseleinschränkung mit zwei separaten ALTER TABLEBefehlen hinzufügen :

ALTER TABLE one
ADD two_id integer;

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

Gibt es eine Möglichkeit, dies mit einem ALTER TABLE-Befehl anstelle von zwei zu tun? Ich konnte mir nichts einfallen lassen, was funktioniert.

Pilz
quelle

Antworten:

185

Wie so oft bei SQL-bezogenen Fragen hängt es vom DBMS ab. In einigen DBMS können Sie durch Kommas getrennte ALTER-Tabellenoperationen kombinieren. Beispielsweise...

Informix- Syntax:

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

Die Syntax für IBM DB2 LUW ist ähnlich und wiederholt das Schlüsselwort ADD, erfordert jedoch (wenn ich das Diagramm richtig gelesen habe) kein Komma, um die hinzugefügten Elemente zu trennen.

Microsoft SQL Server- Syntax:

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

Bei einigen anderen können Sie solche ALTER TABLE-Operationen nicht kombinieren. Standard SQL erlaubt nur eine einzelne Operation in der Anweisung ALTER TABLE. In Standard SQL muss dies also in zwei Schritten erfolgen.

Jonathan Leffler
quelle
5
Zweites Hinzufügen und Einschränken.
Imran
18
Um der Einschränkung einen Namen zu geben, schreiben Sie den SQL-Teil folgendermaßen: ALTER TABLE [Nachrichten] 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)
sqladmin
quelle
Für welchen DB-Motor ist das?
Knocte
@knocte es ist für MS SQL Server - Frage ist jetzt markiert, um das zu verdeutlichen
SQLladmin
Ich denke nicht, dass die Frage geklärt werden muss, da die akzeptierte Antwort bereits besagt, dass es einen großen Unterschied zwischen DB-Motoren gibt, was zu tun ist. Was geklärt werden muss, ist Ihre Antwort, also habe ich das einfach getan
knocte
9
Bis zur Benennung Ihrer Einschränkung. Mit der akzeptierten Antwort kann das System den Namen generieren, der schwierig und später schwer zu verwalten ist.
Derpy
17

Für SQL Server sollte es so etwas wie sein

ALTER TABLE one
ADD two_id integer constraint fk foreign key references two(id)
jausel
quelle
1
Dies ist etwas prägnanter als die anderen Antworten.
Sam
11

In MS SQL SERVER:

Mit benutzerdefiniertem Fremdschlüsselnamen

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

Ohne benutzerdefinierten Fremdschlüsselnamen

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

In Oracle :

ALTER TABLE one ADD two_id INTEGER CONSTRAINT Fk_two_id REFERENCES two(id);
O.Badr
quelle
2

2020 Update

Es ist eine ziemlich alte Frage, aber die Leute kehren immer noch darauf zurück, wie ich sehe. Falls Ihnen die obigen Antworten nicht geholfen haben, stellen Sie sicher, dass Sie für die neue Spalte denselben Datentyp wie die ID der anderen Tabelle verwenden.

In meinem Fall habe ich Laravel verwendet und für alle meine IDs "vorzeichenlose Ganzzahl" verwendet, da es keinen Sinn macht, eine negative ID LOL zu haben.

Dafür ändert sich die unformatierte SQL-Abfrage folgendermaßen:

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

Ich hoffe, es hilft

Lerner
quelle
1
"ADD CONSTRAINT" sollte nur "CONSTRAINT" sein, ja?
TimH
1

Sie können dies wie unten in SQL Server tun

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

PostgreSQL-DLL zum Hinzufügen einer FK-Spalte:

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

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

Arsman Ahmad
quelle
1

Für DB2 lautet die Syntax:

ALTER TABLE one ADD two_id INTEGER FOREIGN KEY (two_id) REFERENCES two (id);
Dan B.
quelle
0

Wenn Sie auch Standardwerte hinzufügen müssen, falls die Tabelle bereits einige Zeilen enthält, fügen Sie den Wert DEFAULT hinzu

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

Versuche dies:

ALTER TABLE product
ADD FOREIGN KEY (product_ID) REFERENCES product(product_ID);
Michael Alavanyo
quelle
1
Willkommen bei SO! Bitte kommentieren Sie Ihre Antworten, wenn es sich nur um Code handelt. In Ihrem Fall gibt es viele Antworten, die Ihren sehr ähnlich sind. Zeigen Sie also Ihre Vorteile auf.
David García Bodego