Benzer bir sorun yaşadığım için çözümümü eklemek için.
TL; DR
- Tabloyu, aynı yabancı anahtar belirtimi ile, ancak daha önce tablonun tuttuğu adla farklı bir adla yeniden oluşturun.
- Ortaya çıkan tabloyu bırakın (ayrıca orijinal yetim yabancı anahtarı da düşürür)
- Orijinal anahtarla veya yabancı anahtar olmadan tabloyu yeniden oluşturun
detay
Yabancı bir anahtarın daha önce düşürülmemesi nedeniyle ALTER TABLE ifadesinin başarısız olduğu kötü durumla karşılaştım. Bu, InnoDB veri sözlüğünde bazı tutarsızlıklara yol açtı (muhtemelen http://bugs.mysql.com/bug.php?id=58215 nedeniyle ).
İlgili soru burada: /programming/16857451/error-in-foreign-key-constraint-on-a-droped-table
mysql> ALTER TABLE `visits` CHANGE COLUMN `variation_visitor_id` `variation_visitor_id` INT(11) NOT NULL ;
'./Db/#sql-482c_8448f' ifadesinin './db/visits' olarak yeniden adlandırılması hatası (errno: 150)
mysql> SHOW ENGINE INNODB STATUS;
Error in foreign key constraint of table db/visits:
FOREIGN KEY (`variation_visitor_id`) REFERENCES `variations_visitors` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html
for correct foreign key definitippon.
# Sql-482c_8448f tablosunu ziyaretlere geri getiremediğim için, alter'den hemen önce yapılan bir yedeklemeden yeniden içe aktarmaya karar verdim. Ancak bu başarısız oldu. Soruşturma hakkında:
- Kısıtlama BİLGİ_SCHEMA.TABLE_CONSTRAINTS ve BİLGİ_SCHEMA.STATISTICS'ten kaldırıldı
- Ancak kısıtlama, hâlâ BİLGİ_SCHEMA.INNODB_SYS_FOREIGN konumunda görülüyordu;
- Masa yoktu, bu yüzden yabancı anahtarı bırakamadım
- Tabloyu hatasız oluşturamadım
SQL / Hatalar
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN WHERE ID='db/fk_visits_variations_visitors1';
+-----------------------------------+-----------+------------------------+--------+------+
| ID | FOR_NAME | REF_NAME | N_COLS | TYPE |
+-----------------------------------+-----------+------------------------+--------+------+
| db/fk_visits_variations_visitors1 | db/visits | db/variations_visitors | 1 | 48 |
+-----------------------------------+-----------+------------------------+--------+------+
Yabancı anahtar olmadan tabloyu yeniden oluşturmaya çalışmak ane hatasına 150 neden oldu
mysql>
SET UNIQUE_CHECKS = 0;
SET FOREIGN_KEY_CHECKS = 0;
CREATE TABLE `visits` (
`id` INT(11) NOT NULL AUTO_INCREMENT ,
`variation_visitor_id` INT(11) NOT NULL ,
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SET FOREIGN_KEY_CHECKS = 1;
SET UNIQUE_CHECKS = 1;
ERROR 1005 (HY000) at line 26: Can't create table 'db.visits' (errno: 150)
mysql> SHOW ENGINE INNODB STATUS;
Error in foreign key constraint of table db/visits:
there is no index in the table which would contain
the columns as the first columns, or the data types in the
table do not match the ones in the referenced table
or one of the ON ... SET NULL columns is declared NOT NULL. Constraint:
,
CONSTRAINT "fk_visits_variations_visitors1" FOREIGN KEY ("variation_visitor_id") REFERENCES "variations_visitors" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION
İle oluşturmaya çalışmak bir hataya neden oldu 121
mysql>
SET UNIQUE_CHECKS = 0;
SET FOREIGN_KEY_CHECKS = 0;
CREATE TABLE `visits` (
`id` INT(11) NOT NULL AUTO_INCREMENT ,
`variation_visitor_id` INT(11) NOT NULL ,
PRIMARY KEY (`id`),
KEY `fk_visits_variations_visitors1` (`variation_visitor_id`),
CONSTRAINT `fk_visits_variations_visitors1` FOREIGN KEY (`variation_visitor_id`) REFERENCES `variations_visitors` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SET FOREIGN_KEY_CHECKS = 1;
SET UNIQUE_CHECKS = 1;
ERROR 1005 (HY000) at line 26: Can't create table 'db.visits' (errno: 121)
mysql> SHOW ENGINE INNODB STATUS;
Error in foreign key constraint creation for table `db`.`visits`.
A foreign key constraint of name `db`.`fk_visits_variations_visitors1`
already exists. (Note that internally InnoDB adds 'databasename'
in front of the user-defined constraint name.)
Note that InnoDB's FOREIGN KEY system tables store
constraint names as case-insensitive, with the
MySQL standard latin1_swedish_ci collation. If you
create tables or databases whose names differ only in
> the character case, then collisions in constraint
names can occur. Workaround: name your constraints
explicitly with unique names.
Sonunda yeni bir yabancı anahtar adı kullandım. Bunun çalışmasını beklemiyordum ama masanın yaratılmasına izin verdi.
mysql>
SET UNIQUE_CHECKS = 0;
SET FOREIGN_KEY_CHECKS = 0;
CREATE TABLE `visits` (
`id` INT(11) NOT NULL AUTO_INCREMENT ,
`variation_visitor_id` INT(11) NOT NULL ,
PRIMARY KEY (`id`),
KEY `fk_visits_variations_visitors2` (`variation_visitor_id`),
CONSTRAINT `fk_visits_variations_visitors2` FOREIGN KEY (`variation_visitor_id`) REFERENCES `variations_visitors` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SET FOREIGN_KEY_CHECKS = 1;
SET UNIQUE_CHECKS = 1;
Bundan sonra tabloyu bırakarak, orijinal yabancı anahtar adıyla bir içe aktarmaya izin vererek BİLGİ_SCHEMA.INNODB_SYS_FOREIGN içindeki hatalı kayıt kaldırıldı.
my_user
ama hata yaklaşıkmy_db.user
...