2010-11-15 78 views
1

我想将多行数据插入到MySQL数据库中,但仅当我的order_id字段是唯一的时候。这是我目前的查询,不起作用。可以说,一个order_id为2的记录已经在表中:在不存在记录的情况下用SQL插入多行

INSERT INTO conversion 
     (user_id,url_id,order_id,sale,commission,transaction_date,process_date) 
VALUES (1,1,1,'32',0.3995,'2010-11-15 12:15:18','2010-11-15 12:15:18'), 
     (3,6,2,'*not-available*',0.001975,'2010-11-15 12:15:18','2010-11-15 12:15:18') 
WHERE (order_id <> 3); 

任何帮助表示赞赏。

汤姆

+0

所以在你的例子中order_id对于两行都是1。在这种情况下你想做什么?你想用order_id <> 1来实现什么? – Unreason 2010-11-15 12:25:31

+0

'VALUES'或表中的'UNIQUE'?如果在上面的情况下表格已经包含1,那么任何记录是否应该在那里? – Quassnoi 2010-11-15 12:28:47

+0

道歉 - 这是一个不好的例子。 Editted。 – tommizzle 2010-11-15 12:32:04

回答

2

使用REPLACE解决。

例子:

REPLACE INTO conversion (user_id,url_id,order_id,sale,commission,transaction_date,process_date) VALUES (1,1,3,'32',0.3995,'2010-11-15 12:50:31','2010-11-15 12:50:31'),(1,2,2,'*not-available*',0.001975,'2010-11-15 12:50:31','2010-11-15 12:50:31'); 

网址:http://dev.mysql.com/doc/refman/5.0/en/replace.html

感谢所有。

+0

heh.I在我的回答中几乎包含了这一点,但我决定不这样做,因为我认为这不会解决您的具体问题。好吧,我很高兴你解决了它。 :) – Spudley 2010-11-15 13:40:59

1

INSERT不支持WHERE子句,因为如果你将它意味着记录当前不存在,所以因此就什么也没有了WHERE条款来看待。

如果插入中的order_id字段与您所需的标准不匹配,则在您给出的示例中执行此操作的方法根本不会调用INSERT语句。

如果你多次调用INSERT,你会得到一些代码(SQL或者外部程序),这些代码循环遍历你插入的行;这将是你过滤它的地方。

1

如果我处于类似的情况,我会创建一个存储过程来处理确定order_id是否已经存在的逻辑。

--Run this first 
--It will create a stored procedure call InsertConversion 
--Begin of stored procedure 
CREATE PROCEDURE InsertConversion 
    @user_id int, 
    @url_id int, 
    @order_id int, 
    @sale varchar(5), 
    @commission money, 
    @transaction_date datetime, 
    @process_date datetime 
AS 
BEGIN 
    SET NOCOUNT ON; 

    if not exists(select order_id from conversion where order_id = @order_id) 
    begin 
     INSERT INTO conversion(user_id, url_id, order_id, sale, commission, transaction_date, process_date) 
     VALUES(@user_id, @url_id, @order_id, @sale, @commission, @transaction_date, @process_date) 
    end 
END 
GO 
--End of stored procedure 

一旦存储过程创建的,你可以执行它,并通过在相同的价值观,你会进入一个INSERT/VALUES语句:

exec InsertConversion 1,1,1,'32',0.3995,'2010-11-15 12:15:18','2010-11-15 12:15:18' 
exec InsertConversion 3,6,2,'*not-available*',0.001975,'2010-11-15 12:15:18','2010-11-15 12:15:18' 

如果你想成为幻想,你可以在商店程序中包含一些“打印”声明,告诉你它是否插入记录。

+0

梦幻般的答案。这绝对看起来比我的解决方案要干净得多。你有什么关于性能差异的想法吗? – tommizzle 2010-11-16 16:22:32

+0

根据我对数据库性能的了解,我没有看到性能上的明显差异。任何一种解决方案都需要查找order_id的存在,并在找不到时插入。我可能在这里是错的,所以不要在这件事上说我的话。 – 2010-11-17 05:34:41

相关问题