INSERT IGNORE
不起作用,因为实际上不会有关键冲突。
这是一个进度队列。对于一个应用程序,我不想要两行状态S
(对于“已启动”)。但是其他应用程序应该能够 - 特别是如果我想强制两个工作项同时发生,我可以。这就是为什么它不是数据库约束的原因。
所以在 SQL 中说“插入不存在的地方”有点棘手。这有效:
insert into user_queue_google
(user_id, status, start_timestamp)
(select 221, 'S', NOW() FROM filter_type
WHERE 221 not in (select user_id from user_queue_google where status = 'S') limit 1);
问题是filter_type
一个完全不相关的表,我只知道它很小并且恰好永远不会为空。如果由于某种原因它是空的,这将失败。
如果不使用 SQL 程序中的存储程序或 IF/THEN 逻辑,我能否避免这种非常可怕的黑客攻击?