前言
我们这里 来看一下 我们经常碰到的 "duplicate key xxx"
测试表结构如下
CREATE TABLE `tz_test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`field1` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
KEY `field1` (`field1`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=10000000 DEFAULT CHARSET=utf8
放入测试数据如下
检查 tz_test 中主键索引 约束的地方
已经存在的记录 和待插入的记录 在目标 索引字段列表 一致, 然后 响应 true 表示存在重复的 id
然后 外层更新错误信息为 DUPLICATE_KEY
然后 外层 write_record 来校验错误信息, 如果是 DUPLICATE_KEY
然后输出 错误编码 以及 错误相关信息
唯一索引冲突
更新建表语句如下
CREATE TABLE `tz_test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`field1` varchar(128) DEFAULT NULL,
`field2` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `field1` (`field1`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8
测试数据如下
执行 sql 如下 “INSERT INTO `test`.`tz_test`(`id`, `field1`, `field2`) VALUES (11, 'field2', '2');”
迭代遍历 索引的地方, 这里首先是使用 id 进行冲突判断, 发现不冲突
然后迭代到下一个索引 field1, 发现 field1 字段有唯一约束, 然后 冲突了, 然后 返回 DUPLICATE_KEY 错误码
field1 索引冲突匹配的地方如下
多个字段的唯一索引冲突
更新建表语句如下
CREATE TABLE `tz_test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`field1` varchar(128) DEFAULT NULL,
`field2` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `field_1_2` (`field1`,`field2`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8
测试数据如下
执行 sql 如下 “INSERT INTO `test`.`tz_test`(`id`, `field1`, `field2`) VALUES (11, 'field2', '2');”
在索引 field_1_2 中找到 一条记录 field1, field2 均相同, 然后出现 冲突
这里 响应 DUPLICATE_KEY
完