确保MySQL密钥的唯一性

确保MySQL密钥的唯一性,mysql,jdbctemplate,Mysql,Jdbctemplate,我有一个MySQL数据库,其中一个键是从第三方源读取的字符串。然而,这些并不总是唯一的,它们是电影标题。因此,我需要检查键的唯一性,如果不是唯一的,则修改它以使其唯一-例如,在键的末尾添加一个递增计数 这样做的最佳模式是什么?我目前有一个表,其中存储了从第三方收到的每个密钥,并存储了一个计数,因此我: INSERT INTO MYTABLE(KEY) VALUES(KEY_VAlUE) ON DUPLICATE KEY UPDATE KEY_COUNT = KEY_COUNT + 1 我使用j

我有一个MySQL数据库,其中一个键是从第三方源读取的字符串。然而,这些并不总是唯一的,它们是电影标题。因此,我需要检查键的唯一性,如果不是唯一的,则修改它以使其唯一-例如,在键的末尾添加一个递增计数

这样做的最佳模式是什么?我目前有一个表,其中存储了从第三方收到的每个密钥,并存储了一个计数,因此我:

INSERT INTO MYTABLE(KEY) VALUES(KEY_VAlUE) ON DUPLICATE KEY UPDATE KEY_COUNT = KEY_COUNT + 1
我使用jdbcTemplate和一个keyHolder来检索新的或更新的行的ID。问题是我还需要把计数拿回来。当然,我现在可以进行第二次查询选择,以获取具有该ID的记录。然而,这里的问题是并发性。虽然不太可能,但在我进行选择之前,可能会发生另一个具有相同第三方密钥的插入。在这种情况下,计数将再次递增,我将返回错误的计数

有什么想法吗


谢谢Richard。

如果您允许系统为任何行创建任意唯一的键值,而不是将其修改为唯一的,那么为什么不使用自动递增功能创建您自己的内部代理项?MySQL有这个权利吗?,并将提交的密钥存储为在非唯一列属性中提交的密钥


对所有关系完整性约束使用内部代理键,对其他非唯一需求仅使用提交的键

做这件事的最好方式是不去做。用这样的字符串键入表格,特别是在你提前知道会发生碰撞的情况下,从长远来看,只会给你带来悲伤。只需使用一个没有意义的自动递增键。如果需要,您仍然可以按标题编制索引,并且不必大量使用数据

顺便说一句,我认为当涉及到电影标题冲突时,惯例是在括号中加上电影的年份,例如制片人1968年与制片人2005年的交易。您正在使用InnoDB,对吗?你应该是


然而,对我来说,电影标题听起来像是一个糟糕的主键。您是否考虑过添加一个,例如一个自动递增整数?

我不知道是否有这样的模式,但为什么不简单地使用事务呢

START TRANSACTION;

INSERT INTO MYTABLE(KEY) VALUES(KEY_VAlUE) ON DUPLICATE KEY UPDATE KEY_COUNT = KEY_COUNT + 1;
SELECT KEY_COUNT FROM MYTABLE WHERE KEY=KEY_VALUE;

COMMIT;

嗨,汤姆。是的,我知道这并不理想。我想这样做的原因是,我有一个很好的人类可读的url-标题被转换成如下url:。因此,_Producers是我唯一的DB密钥,用于从DB中提取正确的电影信息。我喜欢今年的建议,谢谢。你的URL和你的主键有什么关系?他们没有理由一定要联系上。嗨,波宾斯。是的,我正在使用InnoDB。交易性可能是我想要的。我会使用标题以外的内容作为键,但我希望URL像:,所以我的电影标题必须是键。为建议干杯。标题可以是唯一的键,而不必是主键。在任何情况下,这种URL样式都很好看,但如果您必须更改/更正电影标题,那么所有旧的引用和URL都将中断。如果重复电影标题很常见,并且在足够大的数据库中,它们可能会很常见,那么不管怎样,你最终会得到“my_movie_title-12”,在这一点上,使用ID和slug风格的mysite.com/1234/my_movie_title似乎不是一个很大的缺点。是的,我认为你可能是对的。prob最容易用title.Hi Zombat编码保证唯一的密钥/id。谢谢你的建议,我认为这是最好的办法。干杯