我正在开发一个游戏,要求用户(主要是孩子)将前缀和后缀组合为唯一的用户名,例如BlueBaron。现在只有这么多的前缀和后缀,因此,如果用户生成了一个现有的前缀和后缀,则会在其后附加一个数字,例如BlueBaron2。
我有一张桌子,如下:
| id | prefix_id | suffix_id | identifier_index | username | hashbrown | salt | coins | ranking | date_created | date_updated
id
是一个自动递增的,唯一的,非null的主键-我假设对于此特定实例,我实际上不需要担心id
。 prefix_id
和suffix_id
并非为空,但是由于它们引用了常见的前缀和后缀,因此它们不是唯一的。其余的行都不为空。
理想情况下,我想检查一个新用户是否具有与另一个用户完全相同的prefix_id
和suffix_id
,并增加identifier_index
。
我尝试使用多个(先执行SELECT然后执行INSERT)语句,但是我担心数据可能不会更新/唯一(另一个用户可能会在您插入之间插入时间,等等)。
在单个插入语句中有可能吗?我已经读过ON DUPLICATE KEY
,但不确定在这里是否适用。
更新:
但是,即使prefix_id和suffix_id不同,identifier_index
也会递增。对于最后一个条目,根本不会增加,从而导致重复的条目错误:
答案 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';
但是请注意,您可能会遇到死锁问题。当该查询仍在运行时尝试插入另一个事务时,会发生这种情况。不过,死锁并不是一个严重的问题。通常,应用程序是通过某种方式构建的,即可以再次尝试,直到成功插入为止。