【发布时间】:2012-08-18 00:19:37
【问题描述】:
我有一个名为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$$
每当作业运行时,它都会在表中创建一个条目,其中包含 type,这是不同作业的唯一标识符,run time 和 records updated 在该运行中。
有两个不同的作业同时运行,类型为:MAILER_UNLOCKED_REWARDS
和MAILER_ALMOST_UNLOCKED。
当这些作业尝试插入具有相同时间戳的条目时,只有其中一个会被插入,而另一个会引发 Duplicate Entry for key 错误。
例如,这两个作业运行如下:
INSERT INTO tbl_jobs
(type,
last_run_on,
records_updated)
VALUES ('MAILER_ALMOST_UNLOCKED',
'2012-08-22 19:10:00',
'f8a35230fb214989ac75bf11c085aa28:b591426df4f340ecbce5a63c2a5a0174')
成功运行,但是当第二个作业运行插入命令时
INSERT INTO tbl_jobs
(type,
last_run_on,
records_updated)
VALUES ('MAILER_UNLOCKED_REWARDS',
'2012-08-22 19:10:00',
'8a003e8934c07f040134c30959c40009:59bcc21b33a0466e8e5dc50443beb945')
它抛出了错误
Duplicate entry 'M-2012-08-22 19:10:00' for key 'PRIMARY'
主键是type 和last_run_on 列的组合。
如果我删除第一个作业的条目,则插入成功,即它要求 timestamp 单独是唯一的。
但是,相同timestamp 的冲突仅发生在这两个作业之间。还有其他作业会为相同的timestamp 插入。
关于可能是什么问题的任何想法?
【问题讨论】:
-
你能显示
show create table tbl_jobs -
只是一个评论,我建议使用代理键。每秒可能出现多个条目。
-
由于主键必须是唯一的,您应该删除脚本的
UNIQUE KEY行。 -
另外,如果您使用
DEFAULT ''定义您的type列,您可能会遇到问题。如果您希望列中包含某些内容,则不应将其默认为空。
标签: mysql primary-key duplicates