MySQL仅插入不存在数据时WHERE NOT EXISTS语句异常,求排查
问题原因及解决方法
你的SQL语句错误在于**INSERT INTO ... SET语法不支持添加WHERE子句**,这种语法仅用于直接插入单条固定数据,无法附加条件判断。
正确写法一:使用INSERT ... SELECT结合NOT EXISTS
将语句改为INSERT ... SELECT格式,通过SELECT的WHERE条件控制是否插入数据:
INSERT INTO sop_records (uid, season_id, start_date, rec_date_create, rec_sop_unique_id, status) SELECT '$user_id', '$season_id', '$startDate', NOW(), '$unique_id', '1' WHERE NOT EXISTS ( SELECT 1 FROM sop_records WHERE start_date = '$startDate' AND rec_sop_unique_id = '$unique_id' AND season_id = '$season_id' )
注:SELECT子句里的字段值要和INSERT指定的字段顺序完全对应。
更可靠的写法:利用唯一索引+INSERT IGNORE
如果要避免并发场景下的重复插入风险,建议先给判断重复的字段创建联合唯一索引:
ALTER TABLE sop_records ADD UNIQUE INDEX idx_unique_record (season_id, start_date, rec_sop_unique_id);
之后使用INSERT IGNORE语句,数据库会自动检测唯一索引,若数据已存在则忽略插入操作:
INSERT IGNORE INTO sop_records SET uid = '$user_id', season_id = '$season_id', start_date = '$startDate', rec_date_create = now(), rec_sop_unique_id = '$unique_id', status = '1';
重要提醒
直接将变量拼接到SQL语句中存在严重的SQL注入风险,请务必使用预处理语句(如PDO的prepare()/execute()、MySQLi的prepare()/bind_param())替代字符串拼接的方式。
内容的提问来源于stack exchange,提问作者Muhammad Faiz Abdullah
相关产品推荐
相关产品推荐

