Kan de kolom die wordt gebruikt in een externe sleutelbeperking niet wijzigen

Ik kreeg deze foutmelding toen ik mijn tabel probeerde te wijzigen.

Error Code: 1833. Cannot change column 'person_id': used in a foreign key constraint 'fk_fav_food_person_id' of table 'table.favorite_food'

Hier is mijn TABELVERKLARING MAKEN die met succes is uitgevoerd.

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)
);

Toen probeerde ik deze verklaring uit te voeren en kreeg de bovenstaande foutmelding.

ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;

Antwoord 1, autoriteit 100%

U kunt controles met buitenlandse sleutels uitschakelen:

SET FOREIGN_KEY_CHECKS = 0;
/* DO WHAT YOU NEED HERE */
SET FOREIGN_KEY_CHECKS = 1;

Zorg ervoor dat u dit NIET tijdens de productie gebruikt en dat u een back-up hebt.


Antwoord 2, autoriteit 63%

Het type en de definitie van het veld voor de externe sleutel en de verwijzing moeten gelijk zijn.
Dit betekent dat uw externe sleutel niet toestaat het type van uw veld te wijzigen.

Een oplossing zou dit kunnen zijn:

LOCK TABLES 
    favorite_food WRITE,
    person WRITE;
ALTER TABLE favorite_food
    DROP FOREIGN KEY fk_fav_food_person_id,
    MODIFY person_id SMALLINT UNSIGNED;

Je kunt nu je person_id wijzigen

ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;

nieuwe sleutel opnieuw maken

ALTER TABLE favorite_food
    ADD CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
          REFERENCES person (person_id);
UNLOCK TABLES;

BEWERKEN:
Bovenstaande sloten toegevoegd, dankzij opmerkingen

U moet het schrijven naar de database verbieden terwijl u dit doet,
anders riskeert u problemen met de gegevensintegriteit.

Ik heb hierboven een schrijfvergrendeling toegevoegd

Alle schrijfopdrachten in een andere sessie dan uw eigen ( INSERT, UPDATE, DELETE) wachten tot een time-out of UNLOCK TABLES; wordt uitgevoerd

http://dev.mysql.com/doc/ refman/5.5/en/lock-tables.html

EDIT 2: OP vroeg om een ​​meer gedetailleerde uitleg van de regel “Het type en de definitie van het veld met de refererende sleutel en de referentie moeten gelijk zijn. Dit betekent dat je buitenlandse sleutel niet toestaat het type van je veld te wijzigen.”

Van MySQL 5.5 Reference Manual: FOREIGN KEY Beperkingen

Overeenkomende kolommen in de refererende sleutel en de sleutel waarnaar wordt verwezen, moeten
hebben vergelijkbare interne gegevenstypen binnen InnoDB, zodat ze kunnen worden
vergeleken zonder typeconversie. De grootte en het teken van typen gehele getallen
moet hetzelfde zijn. De lengte van stringtypes hoeft niet hetzelfde te zijn. Voor
niet-binaire (teken)tekenreekskolommen, de tekenset en sortering
moet hetzelfde zijn.


Antwoord 3

Ga naar het tabblad structuur van de betreffende tabel.
Onder acties heb je indexen.
Laat ze vallen

Zodra u klaar bent met de nodige aanpassingen,
Breng de externe sleutel terug en herstel de verwijderde indexen. Zorg er vervolgens voor dat uw structuur hetzelfde is en niet is gewijzigd


Antwoord 4

Wanneer u sleutels instelt (primair of buitenlands), stelt u beperkingen in hoe ze kunnen worden gebruikt, wat op zijn beurt weer beperkt wat u ermee kunt doen. Als u de kolom echt wilt wijzigen, kunt u de tabel opnieuw maken zonder de beperkingen, hoewel ik dit afraad. Over het algemeen geldt dat als je een situatie hebt waarin je iets wilt doen, maar deze wordt geblokkeerd door een beperking, dit het beste kan worden opgelost door te veranderen wat je wilt doen in plaats van de beperking.

Other episodes