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.
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.
Tags und Links mysql primary-key foreign-keys constraints mysql-error-1025