2010-11-15 71 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

相關問題