我围绕着为什么以下代码向我抛出错误:我得到的错误是:
[ERROR in query 5] Duplicate entry '1' for key 'PRIMARY'
这是我正在执行的查询:
DROP TABLE IF EXISTS `core_store`;
CREATE TABLE `core_store` (
`store_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Store Id',
`code` varchar(32) DEFAULT NULL COMMENT 'Code',
`website_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Website Id',
`group_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Group Id',
`name` varchar(255) NOT NULL COMMENT 'Store Name',
`sort_order` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Store Sort Order',
`is_active` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Store Activity',
PRIMARY KEY (`store_id`),
UNIQUE KEY `UNQ_CORE_STORE_CODE` (`code`),
KEY `IDX_CORE_STORE_WEBSITE_ID` (`website_id`),
KEY `IDX_CORE_STORE_IS_ACTIVE_SORT_ORDER` (`is_active`,`sort_order`),
KEY `IDX_CORE_STORE_GROUP_ID` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Stores';
LOCK TABLES `core_store` WRITE;
/*!40000 ALTER TABLE `core_store` DISABLE KEYS */;
INSERT INTO `core_store` (`store_id`, `code`, `website_id`, `group_id`, `name`, `sort_order`, `is_active`)
VALUES
(0,'admin',0,0,'Admin',0,1),
(1,'store',1,1,'Store',0,1);
/*!40000 ALTER TABLE `core_store` ENABLE KEYS */;
UNLOCK TABLES;
当我删除除主要键之外的所有键时,我也会收到此错误:
DROP TABLE IF EXISTS `core_store`;
CREATE TABLE `core_store` (
`store_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Store Id',
`code` varchar(32) DEFAULT NULL COMMENT 'Code',
`website_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Website Id',
`group_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Group Id',
`name` varchar(255) NOT NULL COMMENT 'Store Name',
`sort_order` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Store Sort Order',
`is_active` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Store Activity',
PRIMARY KEY (`store_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Stores';
LOCK TABLES `core_store` WRITE;
/*!40000 ALTER TABLE `core_store` DISABLE KEYS */;
INSERT INTO `core_store` (`store_id`, `code`, `website_id`, `group_id`, `name`, `sort_order`, `is_active`)
VALUES
(0,'admin',0,0,'Admin',0,1),
(1,'store',1,1,'Store',0,1);
/*!40000 ALTER TABLE `core_store` ENABLE KEYS */;
UNLOCK TABLES;
有谁知道这里出了什么问题? ID是' 0' 0或许与它有关?当我用多行没有ID = 0条目重复查询时,它可以工作。那么这里发生了什么?
答案 0 :(得分:0)
嗨由于外键约束而且由于自动递增id而导致上述查询返回错误。 对于第一个插入,你提供store_id = 0但是作为一个自动增量id,它的值为first insert = 1所以对于第二个插入查询它的抛出错误1-1重复。
请运行其他更新查询以更正store_id。 我已经将store_id更改为1和2而不是0,1表示2插入语句然后我将它们更新为正确的值。
运行整个sql,从SET FOREIGN KEY开始,更新查询,不仅更新查询。
我在张贴之前测试了它。
SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `core_store`;
CREATE TABLE `core_store` (
`store_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Store Id',
`code` varchar(32) DEFAULT NULL COMMENT 'Code',
`website_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Website Id',
`group_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Group Id',
`name` varchar(255) NOT NULL COMMENT 'Store Name',
`sort_order` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Store Sort Order',
`is_active` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Store Activity',
PRIMARY KEY (`store_id`),
UNIQUE KEY `UNQ_CORE_STORE_CODE` (`code`),
KEY `IDX_CORE_STORE_WEBSITE_ID` (`website_id`),
KEY `IDX_CORE_STORE_IS_ACTIVE_SORT_ORDER` (`is_active`,`sort_order`),
KEY `IDX_CORE_STORE_GROUP_ID` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Stores';
LOCK TABLES `core_store` WRITE;
/*!40000 ALTER TABLE `core_store` DISABLE KEYS */;
INSERT INTO `core_store` (`store_id`, `code`, `website_id`, `group_id`, `name`, `sort_order`, `is_active`)
VALUES
(1,'admin',0,0,'Admin',0,1),
(2,'store',1,1,'Store',0,1);
UPDATE `core_store` SET `store_id` = '0' WHERE `store_id` = '1' COLLATE utf8_bin LIMIT 1;
UPDATE `core_store` SET `store_id` = '1' WHERE `store_id` = '2' COLLATE utf8_bin LIMIT 1;
/*!40000 ALTER TABLE `core_store` ENABLE KEYS */;
UNLOCK TABLES;
答案 1 :(得分:0)
这个答案帮助了我here。
基本解决方案是:
块引用 SET [GLOBAL | SESSION] sql_mode =' NO_AUTO_VALUE_ON_ZERO'
请参阅我的评论,我还解决了其中一个问题,因为这是在中间脚本中被覆盖的。