2013-02-25 80 views
2

在MySQL中,是否可以在表中插入多行並獲取成功或失敗行的列表?嘗試多次插入並獲取失敗的ID列表

或者你必須在自己的語句中分別插入每一行,以確定插入是否成功?

(可以將多個刀片在批量提交,但每個成功的任何其他數據庫分別佔?如PostgreSQL的?)

+1

爲什麼插入失敗?由於重複的ID?沒有辦法找回哪些行失敗,但可以替換已存在的ID。通常,如果插入失敗,整個查詢將停止。 – sjdaws 2013-02-25 08:21:25

+0

@sjdaws是約束失敗例如重複;所以沒有辦法...也許如果你把答案放在答案中,你可以得到upvotes並接受它 – Will 2013-02-25 10:52:05

+0

我已經添加了一個關於找到失敗的方式有點圓的答案。 – sjdaws 2013-02-25 11:03:18

回答

5

有沒有辦法找出哪些行做批量插入時失敗。通常,如果您正在執行多個插入,並且其中一個因任何原因失敗,則查詢將失敗。

但是,有幾個選項可以確保您的查詢成功。

1)使用REPLACE INTO而不是INSERT INTO。如果主鍵已經存在,這將導致MySQL重寫現有的行。

2)使用INSERT IGNORE INTO跳過現有的行。缺點是你不知道哪些行被跳過。 3)使用INSERT INTO ... ON DUPLICATE KEY UPDATE ...。這將允許您更新已存在的行的一個,兩個或所有字段。如果您有空字段,您也可以將其用作僞故障指示器。

// clear out failures from previous runs 
UPDATE table SET failures = 0; 

// insert the row if we can, otherwise record the failure and move on without updating the row 
INSERT INTO table 
    (id, name) VALUES 
    (1, 'John'), 
    (2, 'Steve'), 
    ... 
    (500, 'Tim') 
    ON DUPLICATE KEY UPDATE failures = failures + 1; 

// check failures 
SELECT id, name, failures FROM table; 
+0

這是一種識別故障的有趣方式,但我無法看到OP在哪裏提到他們有'故障'列。不過,無論如何,我喜歡這個方法+1。 – 2013-02-25 12:13:41

+0

這是一個例子,OP沒有提到任何表或列。如果這是在實踐中實現的,我會假設失敗列的默認值爲0,因此它不要求您返回並更新其他代碼。 – sjdaws 2013-02-25 12:17:54