我创建了以下触发器来使用唯一的整数值填充字段。
我在 InnoDB 表中使用它,并且该字段有一个 UNIQUE 键约束。
是否有可能两个并发插入产生相同的值,并且由于唯一约束,其中一个插入失败,或者触发器是“原子的”?
这段代码还有其他我可能没有想到的问题吗?
是否有更好的方法来获得我想要的行为?也许自动增量值有一些同构的软性?
CREATE TRIGGER `generate_customer_id` BEFORE INSERT ON `users`
FOR EACH ROW BEGIN
DECLARE i INT;
DECLARE duplicate INT DEFAULT 1;
DECLARE tries INT DEFAULT 0;
WHILE duplicate > 0 DO
SET tries = tries + 1;
IF tries > 100 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'no customer id found after 100 tries', MYSQL_ERRNO = 1001;
END IF;
SET i = ROUND((RAND() * (999999999-100000000))+100000000);
SET duplicate = (SELECT COUNT(*) FROM users WHERE customer_id = i);
END WHILE;
SET NEW.customer_id = i;
END
最佳答案
随机数生成器的一个可能的替代方案是创建 customer_ids
具有 auto_increment 主键的表 - 在表中创建一个新行,为 users
创建唯一的 customer_id表
关于mysql - mysql触发器是原子的吗?这个mysql触发器有并发问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26189604/