如果表中已经满足某些条件的行数少于20,那么如何构造一个仅执行的MySQL INSERT查询,否则会失败?
也就是说,如果表有18行满足条件,那么INSERT应该继续。如果表有23行满足条件,那么INSERT应该失败。
对于原子性,我需要在一个查询中表达这一点,因此两个请求不能同时进行INSERT,每个请求都在“信念”中只有19行满足条件。
谢谢。
答案 0 :(得分:7)
怎么样:
INSERT INTO TargetTable(Column1, Column2, ...)
SELECT 'Value For Column 1', 'Value For Column 2', ...
FROM Dual
WHERE (SELECT COUNT(*) FROM TargetTable WHERE ...Some Condition...) < 20;
如果不满足WHERE子句,则不插入行;如果满足where子句,则插入一行。
您可以调整相同的机制以从另一个表中进行选择(而不是来自DUAL的单行值)。
答案 1 :(得分:1)
我唯一能得到的就是锁定表格,计算记录,执行操作,解锁表格。
LOCK TABLES t WRITE;
perform count
decide - to insert or not in your programming language
UNLOCK TABLES;
答案 2 :(得分:0)
declare @varaibleOne int;
WAITFOR DELAY '00:00:02';
select
@varaibleOne=SUM(case when (condition satisfied) then 1 else 0 end)
from table where (if you have anything)
IF(@varaibleOne<=20)
begin
insert into table ()
end
等待陈述不确定..你可以谷歌吧..
答案 3 :(得分:0)
我知道获取查询以实际抛出错误的唯一方法是使用SIGNAL command - 只能在存储过程内部的MySQL 5.5中访问。
创建存储过程以体现此任务是否可以接受?如果是这样,就可以做你想做的事。
否则,您唯一的选择是运行两个查询 - 一个用于检查行数,另一个用于插入新行,如果有足够的行来满足您的条件。
这也可以在存储过程(或函数)中完成,这样您就可以使用代码中的一个查询来调用它。