如何在mysql中为insert应用竞争条件
我想检查如何在mysql中为insert应用竞争条件,mysql,sql,Mysql,Sql,我想检查wp_joinroom表中的记录是否大于0,然后我只想添加记录,我已经尝试过这个方法,但我不确定,如何以标准方式进行,有人能帮助我解决这个问题吗?任何帮助都将不胜感激,这里我已经添加了我的问题,我已经尝试过了,谢谢 query : SELECT coun(*) FROM wp_joinroom where room_id = 1; INSERT INTO wp_joinroom (room_id,is_admin,user_id) values (1,0,2) 您可以
wp_joinroom
表中的记录是否大于0,然后我只想添加记录,我已经尝试过这个方法,但我不确定,如何以标准方式进行,有人能帮助我解决这个问题吗?任何帮助都将不胜感激,这里我已经添加了我的问题,我已经尝试过了,谢谢
query :
SELECT coun(*) FROM wp_joinroom where room_id = 1;
INSERT INTO wp_joinroom (room_id,is_admin,user_id) values (1,0,2)
您可以使用动态sql方法 如果房间id为1的行存在,则Thsi只能插入值
SELECT IF ( NOT EXISTS(SELECT 1 FROM wp_joinroom where room_id = 1)
,@sql := 'INSERT INTO wp_joinroom (room_id,is_admin,user_id) values (1,0,2)'
,@sql := 'Do NULL') ;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
在纯SQL中,您可以尝试以下方法
INSERT INTO wp_joinroom (room_id,is_admin,user_id)
SELECT *
FROM (VALUES ROW(1,0,2)) AS temp
WHERE NOT EXISTS (SELECT room_id FROM wp_joinroom where room_id = 1);
这将仅在表中不存在房间id时插入值。如果希望
房间id
在wp\u join\u room
中唯一,则使用唯一约束或索引:
alter table wp_join_room add constraint unq_wp_join_room_room
unique (room_id);
这将防止表中出现重复项。数据库验证此条件,因此竞争条件没有问题。这种可靠性很难用多个查询来保证
请注意,尝试插入重复项将导致错误。如果要避免此错误,请使用
插入忽略
、重复密钥更新
、或冲突
。我推荐最后两种方法中的一种,但这取决于您使用的MySQL版本。我不明白您想要实现什么。示例查询让您获取一个计数,但我不确定如何处理该计数。DBFIDLE最好能显示您期望的结果。如果count为0,则只应运行insert查询