【问题标题】:Conditional INSERT INTO MySQL - WHERE NOT EXISTS有条件的 INSERT INTO MySQL - 不存在的地方
【发布时间】:2013-03-26 21:20:06
【问题描述】:

当客户还没有购买产品的记录时,我正在尝试执行 INSERT INTO 查询。

我尝试了下面的 SQL,但它似乎不起作用。

$queryAddPurchase = "INSERT INTO purchase (UserID, Product, Price) 
              VALUES ('$userID', '$product', '$price')
              WHERE NOT EXISTS(SELECT Product
                                       FROM purchase
                       WHERE Product = '$product'
                       AND UserID = '$userID')";

我收到的错误如下:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的“WHERE NOT EXISTS(SELECT Product FROM purchase”附近使用正确的语法

任何建议将不胜感激!

【问题讨论】:

  • 你说它不工作是什么意思?
  • 您可以将UserIDProduct 设置为唯一键,然后使用INSERT IGNOREREPLACE INTOON DUPLICATE KEY UPDATE 之一。
  • 我收到以下错误:
  • 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的“WHERE NOT EXISTS(SELECT Product FROM purchase”附近使用正确的语法
  • 把错误放在你的问题中

标签: php mysql sql-insert


【解决方案1】:

假设用户只能购买每种产品中的一种(永远为所有产品)。

ALTER TABLE purchase ADD UNIQUE KEY (`UserID`, `Product`); -- run this just once. this changes the table

INSERT IGNORE INTO purchase (UserID, Product, Price) VALUES ('$userID', '$product', '$price');

请注意,这会阻止他多次购买任何产品,这可能不是预期的结果。

【讨论】:

    【解决方案2】:

    如果可能,向表中添加一个 UNIQUE 约束。有点像...

    alter table purchase add unique user_product (UserID, ProductID);
    

    你的条件插入变得微不足道:

    INSERT IGNORE INTO purchase (UserID, Product, Price) 
        VALUES ('$userID', '$product', '$price')
    

    如果这不是适合您的解决方案,请在此处使用所选答案:MySQL Conditional Insert

    简短的回答:

    INSERT INTO purchase (UserID, Product, Price) 
        SELECT '$userID', '$product', '$price'
        FROM dual
            WHERE NOT EXISTS (
                SELECT * FROM purchase
                WHERE UserID='$userID'
                    AND ProductID='$product'
            )
    

    【讨论】:

    • 我应该提一下,如果您的架构允许,这可能是理想的,因为无论如何您都可能希望这些列被索引以供查找。
    • mysql 不允许这样做。 另一种选择
    • @scones 你确定吗?所选答案的评论者似乎证明它有效......
    • @swidgen 发现了我的错误,那里的答案是正确的。通过dual 的魔力工作。为你 +1 :)
    • @scones 刚刚在 MySQL 5.1 上测试过。有用。 insert into states (name) select 'Wisconsin' from dual where not exists (select name from states where name='Wisconsin');
    猜你喜欢
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2010-10-26
    • 2020-06-07
    • 2012-05-21
    • 1970-01-01
    相关资源
    最近更新 更多