如何在sql插入时抑制唯一密钥检查

csga3l58  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(336)

我有一个mysql数据库和一些表。
在其中一个表中,我想通过sql脚本插入一些新行。
不幸的是,我必须在两列中插入一个空字符串,这两列是该表唯一键的一部分。
所以我尝试在插入之前和之后设置唯一的\u检查,但是由于重复的条目,我得到了错误。
以下是表格的定义:

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;

如你所见,我使用的是独一无二的支票。
但正如我所说的,这不能正常工作。
任何帮助或建议都将不胜感激。
帕特里克

sxpgvts3

sxpgvts31#

为insert操作关闭unique键并不表示它将只检查再次打开后发生的操作的唯一性。这只意味着数据库在关闭约束时不会浪费时间来检查约束,但当您再次打开约束时,它会检查约束。
意思是,在打开列之前,您需要确保该列在具有唯一键的列中具有唯一值。但你不会这么做。
如果您希望以某种方式保持在某个时间点之后插入的新记录的唯一性,则需要创建触发器并根据现有数据手动检查新记录。更新也可能如此。但我不建议您这样做—您可能应该重新设计数据,使唯一键不在那里,或者数据对于存在的和将存在的所有记录都是真正唯一的。

相关问题