【发布时间】:2020-09-16 06:14:03
【问题描述】:
我有这张桌子
CREATE TABLE `pcodes` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`product_id` int(10) unsigned NOT NULL,
`code` varchar(100) NOT NULL,
`used` int(10) unsigned NOT NULL DEFAULT '0',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
)
插入命令如下:
INSERT INTO `pcodes` (`product_id`, `code`) VALUES ('1', 'test2');
该表包含每个 product_id 的随机代码。我想随机获取一个未使用的代码(LIMIT 1 可以满足这项工作),将代码标记为已使用并将其返回到下一层。
到目前为止,我是这样做的:
SELECT * FROM pcodes where product_id=1 and used=0 LIMIT 1
UPDATE pcodes SET used= 1 WHERE (id = 2);
但这在多个线程请求第一个未使用的代码时效果不佳。执行此查询的最佳解决方案是什么?我想避免使用存储过程。
【问题讨论】:
-
MySQL 无法在一个查询中更新和选择 - 因此您需要 2 个单独的查询。
SELECT .. FOR UPDATE,然后是UPDATE。如果您需要检查更新是否成功,那么您需要第三次查询。 -
used列是否可能包含您的代码0和1中未使用的值? -
@Akina 不,不会有其他值。 used =1 或 0(未使用)