我有一個ID爲主鍵的主表,以及其他用於此事的非重要字段。 我想要做的是刪除多個記錄,方法是發送要刪除的ID列表作爲存儲過程的參數。向MySQL存儲過程發送相同字段的值列表
我知道如何手動執行此操作(直接在PHP中構建查詢),但我想避免這種情況,並直接在數據庫中執行所有SQL操作。
嘗試搜索,但無法找到任何相關的問題。對不起,如果這是重複的。
感謝
我有一個ID爲主鍵的主表,以及其他用於此事的非重要字段。 我想要做的是刪除多個記錄,方法是發送要刪除的ID列表作爲存儲過程的參數。向MySQL存儲過程發送相同字段的值列表
我知道如何手動執行此操作(直接在PHP中構建查詢),但我想避免這種情況,並直接在數據庫中執行所有SQL操作。
嘗試搜索,但無法找到任何相關的問題。對不起,如果這是重複的。
感謝
我對@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注入的重大風險(揭示一些人認爲存儲過程本質上更安全的說法)。
按照以http://dev.mysql.com/doc/refman/5.1/en/faqs-stored-procs.html#qandaitem-B-4-1-17你不能直接這樣做。
但我認爲你可以嘗試下面的技巧:
也許它有幫助。
你可以嘗試像
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()函數應該注意這一點。
非常感謝,這工作。我不擅長MySQL,所以不知道要準確搜索什麼。我記得我在Oracle上遇到的麻煩,並將逗號分隔字符串轉換爲特定類型,然後在查詢中使用它們來實現此結果。 :) – phil
非常感謝,因爲附加信息接受了此回覆。 – phil