我想构建仅在statement为true时才将行插入表的查询。 在我看来它应该是这样的(这是最简单的方法 - 将它分成多个查询):
if((SELECT COUNT(*) FROM my_table WHERE value1 = x)>0){
//response: already inserted
}else if((SELECT COUNT(*) FROM my_table WHERE value2 = x AND value3 = true)>0){ //checking for very very other specific case
//response: another error response - to tell user why action is wrong
}else{
INSERT INTO my_table value1, value2 ...
//response: ok
}
最简单的方法是将其拆分为多个查询,然后使用此算法,但我想将其作为单个查询,因为我认为连接到db,查询,获取和获取响应等之间的轮数较少。效率更高。
我在考虑在语句为false时抛出自定义mysql代码,但我不知道查询本身应该是什么样子。
答案 0 :(得分:0)
我可能不会这样做 - 但是这可能是这样的:
INSERT INTO my_table (value1, value2, value3)
SELECT 'x', 'y', true
FROM (
SELECT
CASE
WHEN EXISTS (SELECT * FROM my_table WHERE value1 = 'x')
THEN @error := 1
WHEN EXISTS (SELECT * FROM my_table WHERE value2 = 'x' AND value3 = true)
THEN @error := 2
ELSE @error := 0
END AS error
) e
WHERE e.error = 0;
SELECT @error;
但是 - 您至少需要两个语句,因为无法在一个语句中插入和选择。但是,如果您的数据库允许,您可以使用一个查询执行此操作。
问题:即使您找到更优雅(仅限SQL)的解决方案,您也会使代码背后的逻辑难以理解。这将减缓开发速度并缩短时间,您需要修复真正的性能瓶颈。