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.


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.


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)

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)

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);

3

In Oracle :

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

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


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)


1

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


1

Für DB2 lautet die Syntax:

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

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);

0

Versuche dies:

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.