Hanya untuk menambahkan solusi saya karena saya punya masalah yang sama.
TL; DR
- Buat kembali meja dengan spesifikasi kunci asing yang sama tetapi dengan nama yang berbeda seperti yang sebelumnya dipegang oleh meja.
- Jatuhkan tabel yang dihasilkan (juga akan menjatuhkan kunci asing asli anak yatim)
- Buat kembali meja dengan kunci asing atau tanpa kunci asing
Detail
Saya mengalami situasi yang tidak menyenangkan di mana pernyataan ALTER TABLE gagal karena kunci asing tidak dijatuhkan sebelumnya. Hal ini menyebabkan beberapa ketidakkonsistenan dalam kamus data InnoDB (mungkin karena http://bugs.mysql.com/bug.php?id=58215 ).
Pertanyaan terkait di sini: /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 ;
Kesalahan saat mengubah nama './db/#sql-482c_8448f' menjadi './db/visits' (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.
Karena saya tidak dapat memulihkan tabel # sql-482c_8448f menjadi kunjungan, saya memutuskan untuk menggantinya dari cadangan yang dilakukan tepat sebelum perubahan. Namun ini gagal. Sedang diselidiki:
- Kendala telah dihapus dari INFORMATION_SCHEMA.TABLE_CONSTRAINTS dan INFORMATION_SCHEMA.STATISTICS
- Namun kendala masih terlihat di INFORMATION_SCHEMA.INNODB_SYS_FOREIGN;
- Meja tidak ada sehingga saya tidak bisa menjatuhkan kunci asing
- Saya tidak bisa membuat tabel tanpa kesalahan
SQL / Kesalahan
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 |
+-----------------------------------+-----------+------------------------+--------+------+
Mencoba membuat ulang tabel tanpa kunci asing menyebabkan kesalahan 150
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
Mencoba membuatnya dengan menyebabkan kesalahan 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.
Akhirnya saya menggunakan nama kunci asing baru. Saya tidak berharap ini berfungsi tetapi memungkinkan tabel dibuat.
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;
Cukup dengan menjatuhkan tabel setelah itu menghapus catatan yang salah di INFORMATION_SCHEMA.INNODB_SYS_FOREIGN, memungkinkan impor dengan nama kunci asing asli.
my_usertetapi kesalahannya adalah tentangmy_db.user...