mic*_*oon 8 mysql primary-key duplicates
我有一个表tbl_jobs,它存储在应用程序中运行的一些后台作业的元数据.架构如下:
CREATE TABLE `tbl_jobs` (
`type` varchar(30) NOT NULL DEFAULT '',
`last_run_on` datetime NOT NULL,
`records_updated` text,
PRIMARY KEY (`type`,`last_run_on`),
UNIQUE KEY `index2` (`type`,`last_run_on`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$
Run Code Online (Sandbox Code Playgroud)
每当作业运行时,它在表中创建一个条目,该条目type是不同作业的唯一标识符,run time并且records updated在该运行中.
有两种不同的作业同时运行类型:MAILER_UNLOCKED_REWARDS
和MAILER_ALMOST_UNLOCKED.
当这些作业尝试使用相同的时间戳插入其条目时,只会插入其中一个,而另一个会因为键错误而引发重复条目.
例如,这两个工作运行如下:
INSERT INTO tbl_jobs
(type,
last_run_on,
records_updated)
VALUES ('MAILER_ALMOST_UNLOCKED',
'2012-08-22 19:10:00',
'f8a35230fb214989ac75bf11c085aa28:b591426df4f340ecbce5a63c2a5a0174')
Run Code Online (Sandbox Code Playgroud)
运行成功,但第二个作业运行插入命令
INSERT INTO tbl_jobs
(type,
last_run_on,
records_updated)
VALUES ('MAILER_UNLOCKED_REWARDS',
'2012-08-22 19:10:00',
'8a003e8934c07f040134c30959c40009:59bcc21b33a0466e8e5dc50443beb945')
Run Code Online (Sandbox Code Playgroud)
它抛出了错误
Duplicate entry 'M-2012-08-22 19:10:00' for key 'PRIMARY'
Run Code Online (Sandbox Code Playgroud)
主键是type和last_run_on列的组合.
如果我删除第一个作业的条目,则插入成功,即它要求timestamp单独使用.
但是,同样的冲突timestamp只发生在这两个作业之间.还有其他作业插入相同的作业timestamp.
关于什么可能是问题的任何想法?
您是否在索引中使用整个“类型”字段?还是只有第一个字符?因为 MySQL 抱怨的关键是
M-2012-08-22 19:10:00
Run Code Online (Sandbox Code Playgroud)
而不是 MAILER_...
尝试运行:
SHOW INDEXES FROM tbl_jobs;
Run Code Online (Sandbox Code Playgroud)
它应该给出类似的东西:
+----------+------------+----------+--------------+-------------+-----------+-------------+ ----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| tbl_jobs | 0 | PRIMARY | 1 | type | A | 0 | NULL | NULL | | BTREE | | |
| tbl_jobs | 0 | PRIMARY | 2 | last_run_on | A | 0 | NULL | NULL | | BTREE | | |
Run Code Online (Sandbox Code Playgroud)
...
我怀疑它会在 PRIMARY 索引的 Sub_part 列中显示“1”:
+----------+------------+----------+--------------+-------------+-----------+-------------+ ----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| tbl_jobs | 0 | PRIMARY | 1 | type | A | 0 | 1 | NULL | | BTREE | | |
| tbl_jobs | 0 | PRIMARY | 2 | last_run_on | A | 0 | NULL | NULL | | BTREE | | |
Run Code Online (Sandbox Code Playgroud)
...
顺便说一句,主键总是唯一的,所以index2你声明的第二个索引是多余的。