【问题标题】:MySQL insert into table if all columns entry for a row does not exists如果行的所有列条目不存在,则 MySQL 插入表
【发布时间】:2014-03-18 21:56:41
【问题描述】:

所以我试图避免调用表,看看我是否有条目以便插入新行或更新它。我正在尝试以下查询,但出现语法错误。有人可以帮忙吗?

这是我的查询:

IF(
  NOT EXISTS(
    SELECT
        *
    FROM
        ranking_rank_data
    WHERE
        rank = '1'
    AND source_id = '1'
    AND ranking_school_id = '2'
  )
) THEN INSERT INTO 
     ranking_rank_data (rank, source_id, ranking_source_id VALUES ('1','2','3')
END IF;

【问题讨论】:

    标签: mysql if-statement exists sql-insert


    【解决方案1】:

    您可以使用 INSERT ... SELECT 查询,从虚拟表 DUAL 中选择并将 where 子句放在那里,如果条件为假,则不会插入任何行:

    INSERT INTO ranking_rank_data (rank, source_id, ranking_source_id)
    SELECT '1','2','3'
    FROM dual
    WHERE
      NOT EXISTS(SELECT *
                 FROM ranking_rank_data
                 WHERE rank = '1' AND source_id = '1' AND ranking_school_id = '2')
    

    请看小提琴here

    【讨论】:

      【解决方案2】:

      您也可以通过在三个值上创建唯一索引来做到这一点:

      create unique index on ranking_rank_data_rank_source_id_ranking_source_id on
          ranking_rank_data(rank, source_id, ranking_source_id);
      

      这将防止重复。然后你可以插入记录(或更新记录)确信没有重复。有两种方法(除了not exists 方法)可以做到这一点。第一个是insert ignore

      INSERT IGNORE INTO ranking_rank_data (rank, source_id, ranking_source_id)
      SELECT '1','2','3';
      

      这会忽略所有错误,而不仅仅是重复错误,所以我更喜欢第二种方法,它使用on duplicate key update

      INSERT IGNORE INTO ranking_rank_data(rank, source_id, ranking_source_id)
          SELECT '1','2','3'
          ON DUPLICATE KEY UPDATE rank = values(rank);
      

      update 语句是忽略错误的无操作。)

      【讨论】:

        【解决方案3】:

        为什么不使用INSERT ON DUPLICATE KEY UPDATE 语法并在rank + source_id + ranking_school_id 上设置唯一键?如果您没有任何要“真正”更新的内容,则可以更新虚拟字段。见https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

        您也可以尝试插入它。它会在重复键上失败,但您可以在 MySQL 之上使用您使用的编程语言处理此错误。

        【讨论】:

        • 我确实试过了。但我只想要一个条件,如果所有三个都具有与插入值相同的值而不被插入,那么这些字段都不是唯一的。
        • 我说的是在多个列上设置唯一键,而不是在每一列上。
        猜你喜欢
        • 1970-01-01
        • 2014-04-14
        • 2018-04-13
        • 2014-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-14
        相关资源
        最近更新 更多