0

我有一个 MySQL DB,其中一个键(一个字符串)是从第三方源读取的。但是,这些并不总是保证是唯一的(它们是电影片名)。因此,我需要检查键的唯一性,如果不是唯一的,则对其进行修改以使其唯一 - 例如,通过在键的末尾添加增量计数。

这样做的最佳模式是什么?我目前有一个表,它存储从第 3 方收到的每个密钥并存储一个计数,所以我这样做:

INSERT INTO MYTABLE(KEY) VALUES(KEY_VAlUE) ON DUPLICATE KEY UPDATE KEY_COUNT = KEY_COUNT + 1

我正在使用 jdbcTemplate 和 keyHolder 来检索新(或更新)行的 ID。问题是我还需要恢复计数。我现在当然可以进行第二次查询 (SELECT) 以获取具有该 ID 的记录。但是这里的问题是并发性。有可能(尽管不太可能),在我执行 SELECT 之前发生另一个具有相同第三方密钥的 INSERT。在这种情况下,计数将第二次增加,我会得到错误的计数。

有任何想法吗?

谢谢理查德。

4

4 回答 4

1

最好的模式是不这样做。用这样的字符串键入你的桌子,特别是在你提前知道会有碰撞的地方,从长远来看只会让你感到悲伤。只需使用其他无意义的自动增量键。如果需要,您仍然可以按标题索引,并且您不必修改数据。

顺便说一句,我认为当涉及电影标题冲突时,惯例是在括号中附加电影的年份,例如“制片人(1968)”与“制片人(2005)”

于 2009-09-01T18:48:21.307 回答
0

如果您允许系统为 ANY 行创建任意唯一键值(开始时未提交为唯一的行),那么,与其将其修改为唯一,不如使用 auto 创建您自己的内部代理键-incrementing 功能(MySQL 有这个权利吗?),并将提交的密钥存储在非唯一列属性中。

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

于 2009-09-01T18:48:04.193 回答
0

交易。您正在使用 InnoDB,对吗?你应该。

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

于 2009-09-01T18:50:10.743 回答
0

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

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;
于 2009-09-01T18:51:05.310 回答