Wie füge ich eine Spalte hinzu und mache sie zu einem Fremdschlüssel in einer einzelnen MySQL-Anweisung?

81

Kann ich in MySQL eine Spalte und einen Fremdschlüssel in derselben Anweisung hinzufügen? Und wie lautet die richtige Syntax zum Hinzufügen des fk?

Hier ist mein SQL:

ALTER TABLE database.table
 ADD COLUMN columnname INT DEFAULT(1),
 FOREIGN KEY (fk_name) REFERENCES reftable(refcolumn) ON DELETE CASCADE;

... und die dazugehörige Fehlermeldung:

Sie haben einen Fehler in Ihrer SQL-Syntax. Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax für die Verwendung in der Nähe von 'FOREIGN KEY (fk_name) REFERENCES reftable (refcolumn) ON DELETE CASCADE' in Zeile 4

VinnieP
quelle

Antworten:

96

Versuche dies:

ALTER TABLE database.table
  ADD COLUMN columnname INT DEFAULT(1),
  ADD FOREIGN KEY fk_name(fk_column) REFERENCES reftable(refcolumn) ON DELETE CASCADE;
Asaph
quelle
6
Und für fk_nameund fk_columnich muss was einfügen ...?
C4d
7
@ C4ud3x fk_nameist ein Name, den Sie dieser speziellen Einschränkung zum Zwecke der Identifizierung geben möchten (dies ist in der Abfrage optional). MySQL generiert ihn ebenfalls automatisch und fk_columnist die Referenzierungsspalte, die als Fremdschlüssel verwendet werden soll.
Rabia Naz Khan
1
Ich würde jedem raten, den Namen der Einschränkung explizit anzugeben. Böse Probleme können Sie finden, wenn Sie diese Spalte in Zukunft löschen möchten und Ihr System bereits in verschiedenen DBs ausgeführt wird, die unterschiedliche Ideen zur automatischen Benennung der Einschränkungen haben (z. B. mariaDB oder mySQL). Ich wollte diese eine Codezeile schonen und habe die Einschränkung nicht wie hier angegeben. Einige Monate, nachdem ich den Preis bezahlt habe, habe ich versucht, eine Migration zu schreiben, die die Spalte in allen Systemen löscht. stackoverflow.com/questions/55374835/…
Alkis Mavridis
37

Die folgende Abfrage fügt eine Spalte nach Änderungsabfrage hinzu, und die Einschränkungsabfrage macht sie zu einer FK in einer einzelnen MySQL-Abfrage. Sie können es so machen,

SYNTAX:

ALTER TABLE `SCHEMANAME`.`TABLE1` 
ADD COLUMN `FK_COLUMN` BIGINT(20) NOT NULL, 
ADD CONSTRAINT `FK_TABLE2_COLUMN` FOREIGN KEY (`FK_COLUMN`) 
REFERENCES `SCHEMANAME`.`TABLE2`(`PK_COLUMN`);

BEISPIEL:

ALTER TABLE `USERDB`.`ADDRESS_TABLE` 
ADD COLUMN `USER_ID` BIGINT(20) NOT NULL AFTER `PHONE_NUMBER`, 
ADD CONSTRAINT `FK_CUSTOMER_TABLE_CUSTOMER_ID` FOREIGN KEY (`USER_ID`) 
REFERENCES `USERDB`.`CUSTOMER_TABLE`(`CUSTOMER_ID`); 
Glücklich
quelle
2

Dies kann etwas vereinfacht werden. Sie müssen nur das Schlüsselwort "ADD" vor "FOREIGN KEY" hinzufügen. Beispiel unten hinzufügen.

ALTER TABLE database.table
ADD COLUMN columnname INT DEFAULT(1),
ADD FOREIGN KEY (fk_name) REFERENCES reftable(refcolumn) ON DELETE CASCADE;
Satendra Rawat
quelle
-3

Du kannst es benutzen.

ALTER TABLE database.table
ADD COLUMN columnname INT DEFAULT(1);
ALTER TABLE database.table add FOREIGN KEY (fk_name) REFERENCES reftable(refcolumn) ON DELETE CASCADE;
Aabid Ansar
quelle