MySQL声明ON DUPLICATE KEY不是键

时间:2018-09-10 07:11:11

标签: mysql

我正在开发一个游戏,要求用户(主要是孩子)将前缀和后缀组合为唯一的用户名,例如BlueBaron。现在只有这么多的前缀和后缀,因此,如果用户生成了一个现有的前缀和后缀,则会在其后附加一个数字,例如BlueBaron2。

我有一张桌子,如下:

| id | prefix_id | suffix_id | identifier_index | username | hashbrown | salt | coins | ranking | date_created | date_updated

id是一个自动递增的,唯一的,非null的主键-我假设对于此特定实例,我实际上不需要担心idprefix_idsuffix_id并非为空,但是由于它们引用了常见的前缀和后缀,因此它们不是唯一的。其余的行都不为空。

理想情况下,我想检查一个新用户是否具有与另一个用户完全相同的prefix_idsuffix_id,并增加identifier_index

我尝试使用多个(先执行SELECT然后执行INSERT)语句,但是我担心数据可能不会更新/唯一(另一个用户可能会在您插入之间插入时间,等等)。

在单个插入语句中有可能吗?我已经读过ON DUPLICATE KEY,但不确定在这里是否适用。

更新:

根据下面的评论和答案,我为有问题的三列创建了唯一索引: enter image description here

但是,即使prefix_id和suffix_id不同,identifier_index也会递增。对于最后一个条目,根本不会增加,从而导致重复的条目错误:

enter image description here

1 个答案:

答案 0 :(得分:2)

这是一个好问题。我不是开发人员,但是从数据库管理员的角度来看,我想您需要这样做。

您肯定需要跨3列的唯一索引。

CREATE TABLE `a` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `prefix_id` varchar(10) NOT NULL,
  `suffix_id` varchar(10) NOT NULL,
  `identifier_index` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uidx_psi` (`prefix_id`,`suffix_id`,`identifier_index`)
) ENGINE=InnoDB;

这是必须的,您想保证数据的完整性!

您的插入语句如下所示:

insert into a (prefix_id, suffix_id, identifier_index) 
select 'asdf', 'qwer', coalesce(max(identifier_index) + 1, 1) 
from a 
where prefix_id = 'asdf' and suffix_id = 'qwer';

但是请注意,您可能会遇到死锁问题。当该查询仍在运行时尝试插入另一个事务时,会发生这种情况。不过,死锁并不是一个严重的问题。通常,应用程序是通过某种方式构建的,即可以再次尝试,直到成功插入为止。