mysql - sql插入时如何抑制唯一键检查
问题描述
我有一个带有一些表的 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。
但正如我所说,这不能正常工作。
任何帮助或建议将不胜感激。
帕特里克
解决方案
关闭插入操作的唯一键并不表示它将仅检查再次打开后发生的操作的唯一性。这只是意味着数据库在关闭期间不会浪费时间检查约束,但是当您再次打开它时它会检查约束。
这意味着您需要确保该列在具有唯一键的列中具有唯一值,然后才能打开它。你不这样做。
如果您想以某种方式为您在某个时间点后插入的新记录保持唯一性,则需要创建触发器并手动检查新记录与现有数据。更新可能也是如此。但我不推荐它 - 您可能应该重新设计数据,以便唯一键不存在,或者数据对于所有存在和将存在的记录来说都是真正唯一的。
推荐阅读
- fish - 鱼壳:“错误:无法打开通用变量文件'/':权限被拒绝”
- javascript - i + 1 值后的 Javascript 切片数组
- javascript - 我得到 = TypeError:无法在“节点”上执行“removeChild”:参数 1 不是“节点”类型
- java - 为什么 th:field 在 Spring Boot 中会导致错误以及如何解决?
- javascript - 如何在打字稿中合并两个内置的记录类型
- jquery - 我不能在 svg 上使用 jQuery 切换
- swiftui - SwiftUI 条件修饰符添加
- node.js - 需要有关 Heroku 部署错误的建议
- node.js - 使用节点 js 进行 Mongo db 复制
- python - kivy --version kivy' 不是内部或外部命令、可运行程序或批处理文件