我对此感到生气。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
在创建此表的外键之前,您需要输入所有外键到它的父表 –
这不是原因。第二个'create table'和后面的'alter table'之间没有** other **语句。 –
好的,我明白了。您只能在索引列上创建外键。所以当你创建表时,任何列都没有索引。因此,创建表后,您需要先索引,然后您可以应用一个外键 –