有条件的 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”附近使用正确的语法
任何建议将不胜感激!
【问题讨论】:
你说它不工作是什么意思? 您可以将UserID
和Product
设置为唯一键,然后使用INSERT IGNORE
、REPLACE INTO
或ON 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 ignore into, replace into等的一些用法小结(转)
INSERT IGNORE 与INSERT INTO的区别,以及replace的用法
MySQL中的insert into 与replace into用法和区别