有条件的 INSERT INTO MySQL - 不存在的地方

Posted

技术标签:

【中文标题】有条件的 INSERT INTO MySQL - 不存在的地方【英文标题】:Conditional INSERT INTO MySQL - WHERE NOT EXISTS 【发布时间】: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”附近使用正确的语法 把错误放在你的问题中 【参考方案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');

以上是关于有条件的 INSERT INTO MySQL - 不存在的地方的主要内容,如果未能解决你的问题,请参考以下文章

MySQL INSERT插入条件判断:如果不存在则插入

MySQL中的insert ignore into, replace into等的一些用法小结(转)

INSERT IGNORE 与INSERT INTO的区别,以及replace的用法

MySQL中的insert into 与replace into用法和区别

mysql中的replace into和insert into的效率问题

MySQL中insert into语句的6种写法