mysql - 仅当语句为 true 时才插入

标签 mysql sql database if-statement insert

我想构建仅当语句为真时才将行插入表的查询。 在我看来,它应该是这样的(这是最简单的方法 - 将其拆分为多个查询):

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/

相关文章:

sql - 逻辑读取是如何计算的?

mysql - 定义添加到数据库中的数据的值(value)的最佳方法是什么?

sql - 如何创建一个 MySQL JOIN 查询,只选择一个表中的行,而另一个表中存在对该行的一定数量的引用?

php - 如何在php中使用conf文件

sql - 如何更改默认的 SELECT TOP 1000 查询以使用 * 而不是每个字段?

php - 粘性行: fetching some rows always on top of list in postgresql

Android - 在 SQLite 数据库中保存位置

mysql - 在Mysql中添加新列时如何轻松维护审计触发器

java - 使用(最好是 Hazelcast)分布式同步原语来高效地同步 MySQL 表访问

sql - SET 附近的语法不正确。期待外部