Mam dwóch już istniejących tabel, które wyglądają (częściowo) z grubsza tak:Zmiana MySQL klucz podstawowy, gdy istnieje klucz obcy contraints
CREATE TABLE parent (
old_pk CHAR(8) NOT NULL PRIMARY KEY
) ENGINE=InnoDB;
CREATE TABLE child (
parent_key CHAR(8),
FOREIGN KEY (parent_key) REFERENCES parent(old_pk)
ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;
Chcę dodać nową autoinkrementacja liczbą całkowitą id
kolumnę parent
i użyj go jako klucza podstawowego, zachowując jednocześnie old_pk
jako unikalny klucz i zezwalając innym tabelom takim jak child
na odwoływanie się do nich w ograniczeniach klucza obcego. Niestety, po prostu mówiąc ALTER TABLE parent DROP PRIMARY KEY
nie działa:
Kod błędu: 1025
Błąd na zmiany nazwy z './data/#sql-4013_70f5e' do './data/parent' (errno: 150)
Niektóre metody googlowania sugerują, że jest to spowodowane istniejącym kluczem obcy z numerem child
. W istocie, potrzebuję sposobu, aby powiedzieć MySQL "użyj tej drugiej kolumny jako klucza podstawowego, ale nie zapomnij o unikalnym kluczu oryginalnego". Czy jest jakiś sposób, aby to osiągnąć, poza porzuceniem kluczowych ograniczeń z child
i przywróceniem ich później?
Załóżmy, że muszę zmienić tabele w miejscu, zamiast tworzyć kopie z tymi samymi danymi i zamienić je później. Próbowałem używać SET FOREIGN_KEY_CHECKS = 0
przed zmianą tabeli, ale to nie pomaga.
Dlatego nie rób klucz podstawowy widoczne dla użytkownika (Jestem za surogat klucza podstawowego z the-get), zmieniające wymagania użytkownika to ból głowy, ale dobrze jest wiedzieć, że twoja baza danych używa zastępczego klucza głównego http://en.wikipedia.org/wiki/Surrogate_key –