Ändern des MySQL-Primärschlüssels, wenn Fremdschlüsselbeschränkungen bestehen

8

Ich habe zwei bereits existierende Tabellen, die (in Teilen) ungefähr so ​​aussehen:

%Vor%

Ich möchte eine neue automatisch inkrementierende Ganzzahl id -Spalte zu parent hinzufügen und sie stattdessen als Primärschlüssel verwenden, während old_pk weiterhin als eindeutiger Schlüssel beibehalten wird und andere Tabellen wie child darauf verweisen können es in ausländischen Schlüsselsätzen. Leider funktioniert ALTER TABLE parent DROP PRIMARY KEY einfach nicht:

  

Fehlercode: 1025

     

Fehler beim Umbenennen von './data/#sql-4013_70f5e' in './data/parent' (errno: 150)

Einiges Googeln deutet darauf hin, dass dies auf den vorhandenen Fremdschlüsselbezug von child zurückzuführen ist. Im Wesentlichen brauche ich einen Weg, um MySQL zu sagen "benutze diese andere Spalte als Primärschlüssel, aber vergiss nicht die Einmaligkeit des Originals". Gibt es eine Möglichkeit, dies zu erreichen, außer die Schlüsselbeschränkungen von child einfach zu löschen und sie anschließend wiederherzustellen?

Nehmen wir an, dass ich die Tabellen an Ort und Stelle ändern muss, anstatt Kopien mit denselben Daten zu erstellen und sie später auszutauschen. Ich habe versucht, SET FOREIGN_KEY_CHECKS = 0 vor der Änderung der Tabelle zu verwenden, aber es scheint nicht zu helfen.

    
wisnij 27.07.2009, 22:30
quelle

2 Antworten

7

Fügen Sie einen alten Index (es könnte sogar UNIQUE sein) zu old_pk hinzu, bevor Sie den Primärschlüssel löschen:

%Vor%     
inerte 05.08.2009, 06:16
quelle
-7

Ich werde darauf mit einem möglicherweise unpopulären Vorschlag eingehen. Verwenden Sie in Ihrer Datenbank keine Fremdschlüsseleinschränkungen. Erzwingen Sie bei Bedarf in TSQL gespeicherte eindeutige Schlüssel und andere Einschränkungen. Es ist meine Erfahrung, dass in skalierten Umgebungen Check-Constraints selten verwendet werden.

Ich sage dies offen gegenüber gegenteiligen Kommentaren / Diskussionen, die sich ergeben könnten. Ich sage nicht, dass dieser Vorschlag richtig ist, nur dass es in den Geschäften, in denen ich gearbeitet habe, die vorherrschende Meinung war.

Eine Anfrage: Wenn Sie mich abmelden, hinterlassen Sie bitte auch einen kurzen Kommentar. In den ungefähr 10 Jahren, in denen ich mit relationalen Datenbanken gearbeitet habe, arbeiten die einzigen Leute, die ich kenne, die Prüfbeschränkungen verwenden, an Systemen, die nicht skalierbar sind. Wenn das die Leute sind, die mich ablehnen, dann kann ich damit leben. Aber wenn Sie an einem skalierten System arbeiten und prüfen, ob Einschränkungen die Norm für Sie sind, würde ich gerne wissen, wer Sie sind, damit ich etwas lesen kann, um zu sehen, was ich vermisst habe.

    
codemonkey 28.07.2009 18:15
quelle