如何在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查询