Wystąpił ten błąd, gdy próbowałem zmienić mój stół.
Error Code: 1833. Cannot change column 'person_id': used in a foreign key constraint 'fk_fav_food_person_id' of table 'table.favorite_food'
Oto moje STWÓRZ STANOWISKO TABELI, które zostały pomyślnie uruchomione.
CREATE TABLE favorite_food(
person_id SMALLINT UNSIGNED,
food VARCHAR(20),
CONSTRAINT pk_favorite_food PRIMARY KEY(person_id,food),
CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
REFERENCES person (person_id)
);
Następnie próbowałem wykonać tę instrukcję i otrzymałem powyższy błąd.
ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
Odpowiedzi:
Typ i definicja pola klucza obcego i odwołania muszą być równe. Oznacza to, że klucz obcy nie pozwala na zmianę typu pola.
Jednym rozwiązaniem byłoby to:
Teraz możesz zmienić swój identyfikator person_id
odtworzyć klucz obcy
EDYCJA: Dodano blokady powyżej, dzięki komentarzom
Dodałem powyżej blokadę zapisu
Wszystkie zapytania zapisujące w dowolnej sesji innej niż Twoja (
INSERT, UPDATE, DELETE
) będą czekać do przekroczenia limitu czasu lubUNLOCK TABLES
; jest wykonywanyhttp://dev.mysql.com/doc/refman/5.5/en/lock-tables.html
EDYCJA 2: OP poprosił o bardziej szczegółowe wyjaśnienie wiersza „Typ i definicja pola klucza obcego oraz odwołanie muszą być równe. Oznacza to, że klucz obcy nie pozwala na zmianę typu pola”.
Z Podręcznika MySQL 5.5: Ograniczenia klucza obcego
źródło
person_id
prawo po rzuceniu klucz obcy? Wygląda na to, że nic nie zmieniłeś, ponieważ jest to już plikSMALLINT UNSIGNED
.Możesz wyłączyć sprawdzanie kluczy obcych:
Upewnij się, że NIE używasz tego na produkcji i masz kopię zapasową.
źródło
SET FOREIGN_KEY_CHECKS
jest objęta zakresem sesji (inne sesje będą nadal miały zastosowane ograniczenie FK). Jest idealny do dodawania / usuwaniaAUTO_INCREMENT
(co nie zmienia rzeczywistego typu danych kolumny), ale nie zadziała, jeśli spróbujesz zmienić typ danych kolumny na „prawdziwy” (powiedzmy, z SMALLINT na INT), ponieważ uzyskasz legalny,150 FK constraint incorrectly formed
kiedy mysql próbuje zastąpić starą tabelę nową. W takim przypadku użyj zaakceptowanej odpowiedzi.Kiedy ustawiasz klucze (podstawowe lub obce), ustawiasz ograniczenia dotyczące tego, jak mogą być używane, co z kolei ogranicza to, co możesz z nimi zrobić. Jeśli naprawdę chcesz zmienić kolumnę, możesz ponownie utworzyć tabelę bez ograniczeń, chociaż odradzam to. Ogólnie rzecz biorąc, jeśli masz sytuację, w której chcesz coś zrobić, ale jest to blokowane przez ograniczenie, najlepiej rozwiązać to, zmieniając to, co chcesz zrobić, zamiast ograniczenia.
źródło