我有一个带有一些表的MySQL数据库。
在这些表之一中,我想通过SQL脚本插入一些新行。
不幸的是,我必须在两列中插入一个空字符串,并且这两列是该表的唯一键的一部分。
所以我尝试在插入之前和之后设置UNIQUE_CHECKS,但是由于条目重复,我遇到了错误。
这是表的定义:
CREATE TABLE `Table_A` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`number` varchar(25) DEFAULT NULL,
`changedBy` varchar(150) DEFAULT NULL,
`changeDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`,`number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
以及导致错误的INSERT语句:
SET UNIQUE_CHECKS = 0;
INSERT INTO `Table_A`
(`name`, `number`, `changedBy`, `changeDate`)
SELECT DISTINCT '', 'myUser', CURRENT_TIMESTAMP
FROM Table_A
AND id NOT IN
(
SELECT DISTINCT id
FROM Table_A
);
SET UNIQUE_CHECKS = 1;
如您所见,我正在使用UNIQUE_CHECKS。
但是正如我所说,这不能正常工作。
任何帮助或建议将不胜感激。
帕特里克
答案 0 :(得分:0)
为插入操作关闭“唯一键”并不表示它将仅检查在您再次打开它之后发生的操作的唯一性。这只是意味着数据库不会在关闭时浪费时间检查约束,而在再次打开时会检查约束。
测量的意思是,您必须确保在打开具有唯一键的列中该列具有唯一值。你不这样做。
如果要在某些时间点插入新记录以某种方式保持唯一性,则需要创建触发器并根据现有数据手动检查新记录。更新可能也一样。但是我不建议这样做-您可能应该重新设计数据,以便不存在唯一键,或者该数据对于存在的所有记录将是唯一的。