2011-08-25 43 views
2

我有一個ID爲主鍵的主表,以及其他用於此事的非重要字段。 我想要做的是刪除多個記錄,方法是發送要刪除的ID列表作爲存儲過程的參數。向MySQL存儲過程發送相同字段的值列表

我知道如何手動執行此操作(直接在PHP中構建查詢),但我想避免這種情況,並直接在數據庫中執行所有SQL操作。

嘗試搜索,但無法找到任何相關的問題。對不起,如果這是重複的。

感謝

回答

1

我對@Marc B給了+1來巧妙地使用FIND_IN_SET()。它不能使用索引,所以性能不好,但它應該工作。

另一個solution,可以工作(但將是緩慢的爲好,因爲它不能使用索引):

DELETE FROM sometable 
WHERE CONCAT(',', param, ',') LIKE CONCAT('%,', idfield, ',%') 

是@Andrej大號描述是不是真的參數綁定的解決方案,這是的存儲過程自變量插入動態SQL字符串之前的preparing它。

SET sql = CONCAT('DELETE FROM sometable WHERE idfield IN (', param, ')'); 
PREPARE stmt FROM sql; 
EXECUTE stmt; 

你不能參數值的列表與一個單一的參數,即使參數的值看起來像一個逗號分隔的整數列表。

插值可以工作,而且受益於索引,但要小心過濾字符串,它包含個數字和逗號。否則,你會引入SQL注入的重大風險(揭示一些人認爲存儲過程本質上更安全的說法)。

+0

非常感謝,因爲附加信息接受了此回覆。 – phil

3

按照以http://dev.mysql.com/doc/refman/5.1/en/faqs-stored-procs.html#qandaitem-B-4-1-17你不能直接這樣做。

但我認爲你可以嘗試下面的技巧:

  1. 創建你喜歡'ID1,ID2,ID3的PHP IDS字符串。
  2. 使用準備好的語句來綁定這個動作。

也許它有幫助。

+0

感謝您的回覆,我會upvote,如果我可以:) – phil

+0

沒問題。比爾擴展了我的想法。 –

+0

我代表你代表安德烈。 :) –

2

你可以嘗試像

DELETE FROM sometable WHERE FIND_IN_SET(idfield, @param) 

不知道,如果this'd工作(而不必訪問MySQL實例,現在來測試)。基本上問題是,如果你將逗號分隔的值列表傳遞給參數,它將只是一個字符串內的sproc,做一個WHERE id IN ('1,2,3')將失敗,因爲這只是一個簡單的字符串,並不完全相同WHERE id IN (1,2,3)find_in_set()函數應該注意這一點。

+0

非常感謝,這工作。我不擅長MySQL,所以不知道要準確搜索什麼。我記得我在Oracle上遇到的麻煩,並將逗號分隔字符串轉換爲特定類型,然後在查詢中使用它們來實現此結果。 :) – phil