2017-03-22 84 views
1

我对此感到生气。mysql错误1022(23000):无法写入;表中的重复键

如果我执行与外键创建语句:

mysql> CREATE TABLE `asset` (
    -> `ID` bigint(20) NOT NULL, 
    -> `CODE` varchar(255) NOT NULL, 
    -> `DESCRIPTION` longtext, 
    -> `NAME` varchar(255) NOT NULL, 
    -> `SYSTEM_NODE_ID` bigint(20) DEFAULT NULL, 
    -> `FUNCTIONAL_NODE_ID` bigint(20) DEFAULT NULL, 
    -> `ZONAL_NODE_ID` bigint(20) DEFAULT NULL, 
    -> `RESPONSIBLE_ID` bigint(20) DEFAULT NULL, 
    -> `ORIGINATOR_ID` bigint(20) DEFAULT NULL, 
    -> `INTERVENTION_PROGRESSIVE` int(11) NOT NULL DEFAULT '0', 
    -> `TICKET_PROGRESSIVE` int(11) NOT NULL DEFAULT '0', 
    -> `WORK_ORDER_PROGRESSIVE` int(11) NOT NULL DEFAULT '0', 
    -> `DEPOT_PROGRESSIVE` int(11) NOT NULL DEFAULT '0', 
    -> PRIMARY KEY (`ID`), 
    -> UNIQUE KEY `UK_ASSET_CODE` (`CODE`), 
    -> FULLTEXT KEY `FT_ASSET` (`CODE`,`NAME`,`DESCRIPTION`), 
    -> CONSTRAINT `FK_ASSET_FUNCTIONAL_NODE_ID` FOREIGN KEY (`FUNCTIONAL_NODE_ID`) REFERENCES `node` (`ID`), 
    -> CONSTRAINT `FK_ASSET_OWNER_ID` FOREIGN KEY (`ORIGINATOR_ID`) REFERENCES `subject` (`ID`), 
    -> CONSTRAINT `FK_ASSET_RESPONSIBLE_ID` FOREIGN KEY (`RESPONSIBLE_ID`) REFERENCES `subject` (`ID`), 
    -> CONSTRAINT `FK_ASSET_SYSTEM_NODE_ID` FOREIGN KEY (`SYSTEM_NODE_ID`) REFERENCES `node` (`ID`), 
    -> CONSTRAINT `FK_ASSET_ZONAL_NODE_ID` FOREIGN KEY (`ZONAL_NODE_ID`) REFERENCES `node` (`ID`) 
    ->) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

ERROR 1215 (HY000): Cannot add foreign key constraint 

但是,如果我移动外键创建表之后,一切都OK了:

mysql> CREATE TABLE `asset` (
    -> `ID` bigint(20) NOT NULL, 
    -> `CODE` varchar(255) NOT NULL, 
    -> `DESCRIPTION` longtext, 
    -> `NAME` varchar(255) NOT NULL, 
    -> `SYSTEM_NODE_ID` bigint(20) DEFAULT NULL, 
    -> `FUNCTIONAL_NODE_ID` bigint(20) DEFAULT NULL, 
    -> `ZONAL_NODE_ID` bigint(20) DEFAULT NULL, 
    -> `RESPONSIBLE_ID` bigint(20) DEFAULT NULL, 
    -> `ORIGINATOR_ID` bigint(20) DEFAULT NULL, 
    -> `INTERVENTION_PROGRESSIVE` int(11) NOT NULL DEFAULT '0', 
    -> `TICKET_PROGRESSIVE` int(11) NOT NULL DEFAULT '0', 
    -> `WORK_ORDER_PROGRESSIVE` int(11) NOT NULL DEFAULT '0', 
    -> `DEPOT_PROGRESSIVE` int(11) NOT NULL DEFAULT '0', 
    -> PRIMARY KEY (`ID`), 
    -> UNIQUE KEY `UK_ASSET_CODE` (`CODE`), 
    -> FULLTEXT KEY `FT_ASSET` (`CODE`,`NAME`,`DESCRIPTION`) 
    ->) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
Query OK, 0 rows affected (0.13 sec) 

mysql> ALTER TABLE `asset` ADD CONSTRAINT `FK_ASSET_FUNCTIONAL_NODE_ID` FOREIGN KEY (`FUNCTIONAL_NODE_ID`) REFERENCES `node` (`ID`); 
Query OK, 0 rows affected (0.01 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> ALTER TABLE `asset` ADD CONSTRAINT `FK_ASSET_OWNER_ID` FOREIGN KEY (`ORIGINATOR_ID`) REFERENCES `subject` (`ID`); 
Query OK, 0 rows affected (0.01 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> ALTER TABLE `asset` ADD CONSTRAINT `FK_ASSET_RESPONSIBLE_ID` FOREIGN KEY (`RESPONSIBLE_ID`) REFERENCES `subject` (`ID`); 
Query OK, 0 rows affected (0.01 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> ALTER TABLE `asset` ADD CONSTRAINT `FK_ASSET_SYSTEM_NODE_ID` FOREIGN KEY (`SYSTEM_NODE_ID`) REFERENCES `node` (`ID`); 
Query OK, 0 rows affected (0.01 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> ALTER TABLE `asset` ADD CONSTRAINT `FK_ASSET_ZONAL_NODE_ID` FOREIGN KEY (`ZONAL_NODE_ID`) REFERENCES `node` (`ID`); 
Query OK, 0 rows affected (0.01 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

那么,有什么区别?

我在5.7.10-log MySQL Community Server (GPL) Windows下10

感谢


很明显:

mysql> show variables like 'fo%'; 
+--------------------+-------+ 
| Variable_name  | Value | 
+--------------------+-------+ 
| foreign_key_checks | OFF | 
+--------------------+-------+ 
1 row in set (0.00 sec) 

,这是show engine innodb status

mysql> show engine innodb status; 

... 

------------------------ 
LATEST FOREIGN KEY ERROR 
------------------------ 
2017-03-22 13:14:17 0x26e4 Error in foreign key constraint of table edea2_atc/asset: 
FOREIGN KEY (`FUNCTIONAL_NODE_ID`) REFERENCES `node` (`ID`), 
    CONSTRAINT `FK_ASSET_OWNER_ID` FOREIGN KEY (`ORIGINATOR_ID`) REFERENCES `subject` (`ID`), 
    CONSTRAINT `FK_ASSET_RESPONSIBLE_ID` FOREIGN KEY (`RESPONSIBLE_ID`) REFERENCES `subject` (`ID`), 
    CONSTRAINT `FK_ASSET_SYSTEM_NODE_ID` FOREIGN KEY (`SYSTEM_NODE_ID`) REFERENCES `node` (`ID`), 
    CONSTRAINT `FK_ASSET_ZONAL_NODE_ID` FOREIGN KEY (`ZONAL_NODE_ID`) REFERENCES `node` (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8: 
Cannot resolve table name close to: 
(`ID`), 
    CONSTRAINT `FK_ASSET_OWNER_ID` FOREIGN KEY (`ORIGINATOR_ID`) REFERENCES `subject` (`ID`), 
    CONSTRAINT `FK_ASSET_RESPONSIBLE_ID` FOREIGN KEY (`RESPONSIBLE_ID`) REFERENCES `subject` (`ID`), 
    CONSTRAINT `FK_ASSET_SYSTEM_NODE_ID` FOREIGN KEY (`SYSTEM_NODE_ID`) REFERENCES `node` (`ID`), 
    CONSTRAINT `FK_ASSET_ZONAL_NODE_ID` FOREIGN KEY (`ZONAL_NODE_ID`) REFERENCES `node` (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
+0

在创建此表的外键之前,您需要输入所有外键到它的父表 –

+0

这不是原因。第二个'create table'和后面的'alter table'之间没有** other **语句。 –

+0

好的,我明白了。您只能在索引列上创建外键。所以当你创建表时,任何列都没有索引。因此,创建表后,您需要先索引,然后您可以应用一个外键 –

回答

1

我无法重现错误。

测试:

mysql> SELECT VERSION(); 
+-----------+ 
| VERSION() | 
+-----------+ 
| 5.7.17 | 
+-----------+ 
1 row in set (0.00 sec) 

mysql> SHOW VARIABLES LIKE 'foreign_key_checks'; 
+--------------------+-------+ 
| Variable_name  | Value | 
+--------------------+-------+ 
| foreign_key_checks | ON | 
+--------------------+-------+ 
1 row in set (0.01 sec) 

mysql> SET @@SESSION.foreign_key_checks := 0; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SHOW VARIABLES LIKE 'foreign_key_checks'; 
+--------------------+-------+ 
| Variable_name  | Value | 
+--------------------+-------+ 
| foreign_key_checks | OFF | 
+--------------------+-------+ 
1 row in set (0.00 sec) 

mysql> DROP TABLE IF EXISTS `asset`; 
Query OK, 0 rows affected, 1 warning (0.00 sec) 

mysql> CREATE TABLE `asset` (
    -> `ID` bigint(20) NOT NULL, 
    -> `CODE` varchar(255) NOT NULL, 
    -> `DESCRIPTION` longtext, 
    -> `NAME` varchar(255) NOT NULL, 
    -> `SYSTEM_NODE_ID` bigint(20) DEFAULT NULL, 
    -> `FUNCTIONAL_NODE_ID` bigint(20) DEFAULT NULL, 
    -> `ZONAL_NODE_ID` bigint(20) DEFAULT NULL, 
    -> `RESPONSIBLE_ID` bigint(20) DEFAULT NULL, 
    -> `ORIGINATOR_ID` bigint(20) DEFAULT NULL, 
    -> `INTERVENTION_PROGRESSIVE` int(11) NOT NULL DEFAULT '0', 
    -> `TICKET_PROGRESSIVE` int(11) NOT NULL DEFAULT '0', 
    -> `WORK_ORDER_PROGRESSIVE` int(11) NOT NULL DEFAULT '0', 
    -> `DEPOT_PROGRESSIVE` int(11) NOT NULL DEFAULT '0', 
    -> PRIMARY KEY (`ID`), 
    -> UNIQUE KEY `UK_ASSET_CODE` (`CODE`), 
    -> FULLTEXT KEY `FT_ASSET` (`CODE`,`NAME`,`DESCRIPTION`), 
    -> CONSTRAINT `FK_ASSET_FUNCTIONAL_NODE_ID` 
    ->  FOREIGN KEY (`FUNCTIONAL_NODE_ID`) REFERENCES `node` (`ID`), 
    -> CONSTRAINT `FK_ASSET_OWNER_ID` 
    ->  FOREIGN KEY (`ORIGINATOR_ID`) REFERENCES `subject` (`ID`), 
    -> CONSTRAINT `FK_ASSET_RESPONSIBLE_ID` 
    ->  FOREIGN KEY (`RESPONSIBLE_ID`) REFERENCES `subject` (`ID`), 
    -> CONSTRAINT `FK_ASSET_SYSTEM_NODE_ID` 
    ->  FOREIGN KEY (`SYSTEM_NODE_ID`) REFERENCES `node` (`ID`), 
    -> CONSTRAINT `FK_ASSET_ZONAL_NODE_ID` 
    ->  FOREIGN KEY (`ZONAL_NODE_ID`) REFERENCES `node` (`ID`) 
    ->) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SET @@SESSION.foreign_key_checks := 1; 
Query OK, 0 rows affected (0.00 sec) 

UPDATE

在5.7.10版本产生了错误。

更新2

Changes in MySQL 5.7.11 (2016-02-05)

InnoDB的:创建了全文索引和外键约束的表时FOREIGN_KEY_CHECKS被禁用失败。 (Bug #22094601Bug #78955)。

参考文献:此错误是Bug #16845421的回归。

+0

我升级到5.7.17,现在它的工作......谢谢! –

+0

@MicheleMariotti:查看更新后的答案。 – wchiquito

相关问题