【问题标题】:sql if not exists () insert not workingsql如果不存在()插入不起作用
【发布时间】:2017-09-03 10:35:21
【问题描述】:

这是我的查询:

IF NOT EXISTS (SELECT * 
               FROM   teovecerdi 
               WHERE  LocationName = 'Frankfurt' 
               AND    StartDate = '14/02/2015' 
               AND    EndDate = '17/02/2015' 
               AND    Price = '2700') 
INSERT INTO teovecerdi(LocationName, StartDate, EndDate, Price)
VALUES(?,?,?,?)

你能告诉我它有什么问题吗?我也尝试过 BEGIN 和 END ,但它仍然给我一个错误。

编辑:我正确处理了参数。

【问题讨论】:

  • 您可能只想在这些字段上创建一个唯一索引,然后执行INSERT INTO ... ON DUPLICATE KEY UPDATE Price=PriceINSERT IGNORE ...
  • NOT EXISTS 查询中的值是否与您尝试插入的值相同?如果它们包含表的唯一索引,则可以使用 INSERT IGNORE

标签: mysql sql if-statement select exists


【解决方案1】:

您不能在查询中使用IF 语句,它只能在存储过程中使用。

如果你想做一个有条件的INSERT,你可以使用SELECT查询,它只在满足条件时返回一行。

INSERT INTO teovecerdi(LocationName, StartDate, EndDate, Price)
SELECT ?, ?, ?, ?
FROM DUAL
WHERE NOT EXISTS (SELECT * 
    FROM   teovecerdi 
    WHERE  LocationName = 'Frankfurt' 
    AND    StartDate = '14/02/2015' 
    AND    EndDate = '17/02/2015' 
    AND    Price = '2700')

【讨论】:

  • 不错,有趣的方法!我猜DUAL 是某种假表?
  • 是的,就是这样。
【解决方案2】:

您不能在查询或脚本中使用 MySQL 的过程语法(包括 IF 之类的,以及迭代构造等)。

【讨论】:

    【解决方案3】:

    我将建议一种不同的方法。我的猜测是你希望LocationName, StartDate, EndDate, Price 是独一无二的。因此,让数据库为您完成工作:

    CREATE UNIQUE INDEX unq_teovecerdi_4 on teovecerdi(LocationName, StartDate, EndDate, Price);
    

    然后在插入时小心“忽略”错误。我的首选方法是:

    INSERT INTO teovecerdi (LocationName, StartDate, EndDate, Price)
        VALUES (?, ?, ?, ?)
        ON DUPLICATE KEY UPDATE LocationName = VALUES(LocationName);
    

    当您尝试插入副本时,ON DUPLICATE KEY 除了吸收错误之外什么都不做。

    【讨论】:

      猜你喜欢
      • 2018-02-05
      • 2014-01-27
      • 2018-09-17
      • 2014-01-25
      • 2019-07-13
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      相关资源
      最近更新 更多