비슷한 문제가있어서 솔루션을 추가하기 만하면됩니다.
TL; DR
- 외래 키 사양은 같지만 이전에 테이블에서 보유한 것과 다른 이름으로 테이블을 다시 만듭니다.
- 결과 테이블을 삭제하십시오 (원래 고아 외래 키도 삭제함).
- 원래 또는 외래 키가없는 테이블을 다시 만듭니다.
세부 묘사
외래 키가 일찍 떨어지지 않아 ALTER TABLE 문이 실패한 불쾌한 상황에 부딪 쳤습니다. 이로 인해 InnoDB 데이터 딕셔너리에 일부 불일치가 발생했습니다 ( http://bugs.mysql.com/bug.php?id=58215 로 인해 ).
관련 질문 : https : //.com/questions/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'의 이름을 './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.
# sql-482c_8448f 테이블을 방문으로 복구 할 수 없으므로 변경 직전에 수행 된 백업에서 테이블을 다시 가져 오기로 결정했습니다. 그러나 이것은 실패했습니다. 조사 중 :
- INFORMATION_SCHEMA.TABLE_CONSTRAINTS 및 INFORMATION_SCHEMA.STATISTICS에서 제한 조건이 제거되었습니다.
- 그러나 제약 조건은 여전히 INFORMATION_SCHEMA.INNODB_SYS_FOREIGN에서 볼 수있었습니다.
- 테이블이 존재하지 않으므로 외래 키를 삭제할 수 없습니다
- 오류없이 테이블을 만들 수 없습니다
SQL / 오류
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 |
+-----------------------------------+-----------+------------------------+--------+------+
외래 키없이 테이블을 다시 만들려고하면 오류 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
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.
결국 새로운 외래 키 이름을 사용했습니다. 나는 이것이 작동하지 않을 것이라고 생각했지만 테이블을 만들 수있었습니다.
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;
그 후 테이블을 삭제하면 INFORMATION_SCHEMA.INNODB_SYS_FOREIGN에서 잘못된 레코드가 제거되어 원래 외래 키 이름으로 가져올 수 있습니다.
my_user
오류는my_db.user
...