Folosind MySQL 5.5. Am un tabel pentru care nu pot adăuga o cheie străină:
ALTER TABLE `SOURCE_TABLE`
ADD CONSTRAIN `ConstraintFK`
CHEIE străină (`otherTableID`)
REFERINȚE `OTHER_TABLE` (`id`)
ON DELETE SET NULL
LA UPDATE CASCADE;
MySQL returnează următoarea eroare:
Cod de eroare: 1005. Nu se poate crea tabelul „my_schema.#sql-4c0c_b6fc8ca” (errno: 121)
Uitandu-ma la AFIȚĂ STAREA MOTORULUI INNODB
Eu iau:
------------------------
ULTIMA EROARE CHEIE STRĂINE
------------------------
220523 16:34:36 Eroare la crearea constrângerii cheii externe pentru tabelul `my_schema`.`#sql-4c0c_b6fc8ca`.
O constrângere de cheie externă a numelui `my_schema`.`ConstraintFK`
deja exista. (Rețineți că în interior InnoDB adaugă „nume bază de date”
în fața numelui constrângerii definite de utilizator.)
Rețineți că tabelele de sistem FOREIGN KEY ale InnoDB stochează
numele de constrângeri ca fiind insensibile la majuscule, cu caracterul
Colaţionare standard MySQL latin1_swedish_ci. daca tu
creați tabele sau baze de date ale căror nume diferă doar în
caractere, apoi coliziuni în constrângere
pot apărea nume. Soluție: numiți constrângerile dvs
explicit cu nume unice.
Desigur, nu există nicio constrângere numită ConstraintFK definită în această schemă, am verificat atât schema de informații, cât și Afișați CREATE TABLE SOURCE_TABLE
ieșire. Acesta din urmă arată că indexul pentru cheia externă există, dar constrângerea cheii externe pare să nu existe:
-- sunt afișate doar informații relevante
CREAȚI TABEL `SOURCE_TABLE` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`otherTableID` int(11) DEFAULT NULL,
CHEIE PRIMARĂ (`id`),
CHEIE `ConstraintFK_idx` (`otherTableID`)
) ENGINE=InnoDB AUTO_INCREMENT=4089 DEFAULT CHARSET=utf8;
CREATE TABLE `OTHER_TABLE` (
`id` int(11) NOT NULL AUTO_INCREMENT,
CHEIE PRIMARĂ (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=58108 DEFAULT CHARSET=utf8;
Într-adevăr, dacă încerc să renunț la această constrângere:
ALTER TABLE `SOURCE_TABLE`
DROP FOREIGN KEY `ConstraintFK`;
Eu iau:
Cod de eroare: 1025.Eroare la redenumirea lui „./my_schema/SOURCE_TABLE” în „./my_schema/#sql2-4c0c-b6fc8ca” (errno: 152)
M-am uitat la sistemul de fișiere și nu văd niciun motiv pentru care redenumirea tabelului ar trebui să eșueze.
Din păcate, încercarea de a interoga schema de informații nu ajută:
SELECTAȚI * FROM information_schema.TABLE_CONSTRAINTS
WHERE information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = „CHEIE străină”
AND information_schema.TABLE_CONSTRAINTS.CONSTRAINT_NAME = 'ConstraintFK';
returnează un set gol, în timp ce:
SELECTAȚI * FROM information_schema.TABLE_CONSTRAINTS
WHERE information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = „CHEIE străină”
AND information_schema.TABLE_CONSTRAINTS.CONSTRAINT_SCHEMA = 'schema_mea';
returnează toate constrângerile cheii străine din my_schema de la care pot obține AFIȚI CREATE TABLE
declarații, dar niciun semn de ConstraintFK...
Uitandu-ma la acest și acest, bănuiesc că s-a întâmplat ceva în trecut care a făcut ca acea cheie externă să fie orfană: într-adevăr, acest SOURCE_TABLE a fost redenumit în urmă cu ceva timp și sunt destul de sigur că cheia externă pe care încerc să o adaug a fost acolo în trecut. Soluția sugerată este să renunțați la schema și să o recreați dintr-un fișier dump. Mai pot încerca ceva care să nu implice renunțarea acestei scheme? Este destul de mare și timpul de nefuncționare ar fi relevant.