Chỉ cần thêm giải pháp của tôi là tôi đã có một vấn đề tương tự.
TL; DR
- Tạo lại bảng với cùng một đặc tả khóa ngoại nhưng với một tên khác như trước đó được giữ bởi bảng.
- Bỏ bảng kết quả (cũng sẽ bỏ khóa ngoại gốc mồ côi gốc)
- Bảng tái tạo với bản gốc hoặc không có khóa ngoại
Chi tiết
Tôi gặp phải tình huống khó chịu khi một câu lệnh ALTER TABLE thất bại do khóa ngoại không bị hủy trước đó. Điều này dẫn đến một số mâu thuẫn trong từ điển dữ liệu InnoDB (có thể là do http://bugs.mysql.com/orms.php?id=58215 ).
Câu hỏi liên quan ở đây: /programming/16857451/error-in-forign-key-constraint-on-a-droped-table
mysql> ALTER TABLE `visits` CHANGE COLUMN `variation_visitor_id` `variation_visitor_id` INT(11) NOT NULL ;
Lỗi khi đổi tên './db/#sql-482c_8448f' thành './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.
Vì tôi không thể khôi phục bảng # sql-482c_8448f cho các lượt truy cập, tôi quyết định nhập lại nó từ bản sao lưu được thực hiện ngay trước khi thay đổi. Tuy nhiên điều này đã thất bại. Về điều tra:
- Ràng buộc đã bị xóa khỏi Information_SCHema.TABLE_CONSTRAINTS và Information_SCHema.STATISTICS
- Nhưng các ràng buộc vẫn có thể nhìn thấy trong Information_SCHema.INNODB_SYS_FOREIGN;
- Bảng không tồn tại nên tôi không thể bỏ khóa ngoại
- Tôi không thể tạo bảng mà không có lỗi
SQL / lỗi
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 |
+-----------------------------------+-----------+------------------------+--------+------+
Cố gắng tạo lại bảng mà không có khóa ngoại gây ra lỗi ane 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
Cố gắng tạo ra nó gây ra lỗi 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.
Cuối cùng, tôi đã sử dụng một tên khóa nước ngoài mới. Tôi không mong đợi nó hoạt động nhưng nó cho phép tạo bảng.
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;
Chỉ cần bỏ bảng sau đó đã xóa bản ghi errant trong THÔNG TIN_SCHema.INNODB_SYS_FOREIGN, cho phép nhập với tên khóa ngoại gốc.
my_user
nhưng lỗi là vềmy_db.user
...