gpt4 book ai didi

mysql - mysql 中键 'PRIMARY' 的重复条目

转载 作者:可可西里 更新时间:2023-11-01 06:33:37 24 4
gpt4 key购买 nike

我有一个名为 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$$

每当作业运行时,它都会在表中创建一个条目,其中包含类型,这是不同作业的唯一标识符,运行时更新记录 在那次运行中。

有两个不同的作业同时运行,类型为:MAILER_UNLOCKED_REWARDSMAILER_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'

主键是 typelast_run_on 列的组合。

如果我删除第一个作业的条目,插入就会成功,即它要求单独的 timestamp 是唯一的。

但是,同一 timestamp 的冲突仅发生在这两个作业之间。还有其他作业会针对同一 timestamp 插入。

对可能出现的问题有什么想法吗?

最佳答案

您是否在索引中使用了整个“类型”字段?还是只有第一个字符?因为 MySQL 提示的关键是

M-2012-08-22 19:10:00

代替 MAILER_...

尝试运行:

 SHOW INDEXES FROM tbl_jobs;

它应该给出如下内容:

+----------+------------+----------+--------------+-------------+-----------+-------------+    ----------+--------+------+------------+---------+---------------+
| 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 | | |

...

而且我怀疑它会在 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 | | |

...

顺便说一句,主键始终是唯一的,因此您声明的第二个索引 index2 是多余的。

关于mysql - mysql 中键 'PRIMARY' 的重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12075445/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com