我想构建仅当语句为真时才将行插入表的查询。 在我看来,它应该是这样的(这是最简单的方法 - 将其拆分为多个查询):
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
}
最简单的方法是将其拆分为多个查询,然后使用此算法,但我想将其作为单个查询,因为我认为连接到数据库、查询、获取和获取响应等之间的轮次更少。效率更高。
我正在考虑在语句错误时抛出自定义 mysql 代码,但我不知道查询本身应该是什么样子。
最佳答案
我可能不会这样做 - 但这样的事情是可能的:
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)解决方案,也会使代码背后的逻辑难以理解。这会减慢开发速度并浪费时间,而您需要这些时间来修复真正的性能瓶颈。
关于mysql - 仅当语句为 true 时才插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43790636/