wake-up-neo.com

Fremdschlüsselspalten in MySQL umbenennen

Wir versuchen, eine Spalte in MySQL (5.1.31, InnoDB), die einen Fremdschlüssel darstellt, in eine andere Tabelle umzubenennen.

Zuerst haben wir versucht, Django-South zu verwenden, stießen jedoch auf ein bekanntes Problem:

http://south.aeracode.org/ticket/243

OperationalError: (1025, "Fehler beim Umbenennen von './xxx/#sql-bf_4d' in './xxx/cave_event' (Fehlernummer: 150)")

UND

Fehler beim Umbenennen von './xxx/#sql-bf_4b' in './xxx/cave_event' (Fehlernummer: 150)

Dieser Fehler 150 betrifft eindeutig Fremdschlüsseleinschränkungen. Siehe z.

Was bedeutet MySQL-Fehler 1025 (HY000): Fehler beim Umbenennen von './foo' (errorno: 150)?

http://www.xaprb.com/blog/2006/08/22/mysqls-error-1025-explained/

Wir versuchen also, die Umbenennung in Raw SQL durchzuführen. Es sieht so aus, als müssten wir zuerst den Fremdschlüssel ablegen, dann die Umbenennung vornehmen und dann den Fremdschlüssel wieder hinzufügen. Klingt das richtig? Gibt es einen besseren Weg, da dies ziemlich verwirrend und umständlich erscheint?

Jede Hilfe wäre sehr dankbar!

44
Greg Detre

AFAIK löscht die Einschränkung, benennt sie um und fügt dann die Einschränkung zurück. Backup zuerst!

50
Dave Swersky

Falls jemand nach der Syntax sucht, geht es ungefähr so:

alter table customer_account drop foreign key `FK3FEDF2CC1CD51BAF`; 

alter table customer_account  add constraint `FK3FEDF2CCD115CB1A` foreign key (campaign_id) REFERENCES campaign(id);
25
34m0

hier ist die SQL-Syntax für reguläre Schlüssel 

ALTER TABLE `thetable`
  DROP KEY `oldkey`, 
  ADD KEY `newkey` (`tablefield`);
3

In @ Deweys Antwort wird ein kleines Skript zum Umbenennen von durch Hibernate generierten FKs in ("FK__" + table name + "__" + referenced table name) beschrieben.

SELECT CONCAT(
  "alter table ", TABLE_NAME, " drop foreign key ", CONSTRAINT_NAME,";\n",
  "alter table ", TABLE_NAME, " drop key ", CONSTRAINT_NAME, ";\n",
  "alter table ", TABLE_NAME, " add key FK__", table_name, "__",
      referenced_table_name, " (", column_name, ");\n",
  "alter table ", TABLE_NAME, " add constraint FK__", table_name, "__",
      referenced_table_name , " foreign key (", column_name, ") ",
      "references ", referenced_table_name,
      "(", referenced_column_name, ");"
  ) AS runMe 
FROM
  information_schema.key_column_usage
WHERE 
  TABLE_SCHEMA='myschemaname' 
  AND 
  constraint_name like 'FK_%';

Ein bisschen Ausgabe:

alter table visitor_browsers drop foreign key FK_4ygermmic4fujggq1kp96dx47;
alter table visitor_browsers drop key FK_4ygermmic4fujggq1kp96dx47;
alter table visitor_browsers add key FK__visitor_browsers__websites (website);
alter table visitor_browsers add constraint FK__visitor_browsers__websites foreign key (website) references websites(id);
0
Jan Żankowski

Diese Aufgabe wird einfacher, wenn Sie GUI-Tools verwenden. Ich habe versucht, die ID-Spalte mit IntelliJ IDEA Database tool umzubenennen, und es funktionierte wie ein Zauber! Ich muss mich beim Umbenennen einer Tabelle oder Spalte nicht um Fremdschlüssel kümmern.

Weitere Details finden Sie in IntelliJ IDEA Help | Elemente umbenennen .

MySQL 5.7

0
naXa

Die folgende Abfrage erstellt automatisch die richtige Syntax ..__ Führen Sie einfach jede zurückgegebene Zeile aus, und alle Ihre FKEYs werden gelöscht.

Ich lasse die Rückseite (füge sie zurück) als Übung für dich.

SELECT CONCAT("alter table ", TABLE_NAME," drop foreign key `", CONSTRAINT_NAME,"`; ") AS runMe
FROM information_schema.key_column_usage 
WHERE TABLE_SCHEMA='MY_SCHEMA_NAME';
0
Dewey