仅在语句为真时插入

时间:2017-05-04 18:48:37

标签: mysql sql database if-statement insert

我想构建仅在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代码,但我不知道查询本身应该是什么样子。

1 个答案:

答案 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)的解决方案,您也会使代码背后的逻辑难以理解。这将减缓开发速度并缩短时间,您需要修复真正的性能瓶颈。