我有一个MySQL表,ID作为主键,其他字段作为这个问题的不重要字段。我想要做的是通过将要删除的is列表作为参数发送到存储过程来删除多条记录。
我知道如何手动执行此操作(直接在PHP中构建查询),但我希望避免这样做,并直接在DB中执行所有SQL。
我试着搜索,但是找不到任何相关的问题。如果这是重复的,很抱歉。
谢谢
发布于 2011-08-26 01:54:50
我将+1赋给了@Marc B,以便巧妙地使用FIND_IN_SET()。它将不能使用索引,因此性能不会很好,但它应该可以工作。
另一个可以工作的solution (但也会很慢,因为它不能使用索引):
DELETE FROM sometable
WHERE CONCAT(',', param, ',') LIKE CONCAT('%,', idfield, ',%')@Andrej L描述的解决方案并不是真正的参数绑定,而是在preparing之前将存储过程参数插入到动态SQL字符串中。
SET sql = CONCAT('DELETE FROM sometable WHERE idfield IN (', param, ')');
PREPARE stmt FROM sql;
EXECUTE stmt;即使参数值看起来像一个逗号分隔的整数列表,也不能用一个参数将值列表参数化。
插值可以工作,它将从索引中受益,但要小心过滤字符串,使其只包含数字和逗号。否则,您将引入SQL注入的重大风险(揭穿一些人声称的存储过程本质上更安全的说法)。
发布于 2011-08-26 01:38:37
根据http://dev.mysql.com/doc/refman/5.1/en/faqs-stored-procs.html#qandaitem-B-4-1-17,你不能直接这么做。
但我认为你可以尝试下面的技巧:
也许这会有帮助。
发布于 2011-08-26 01:39:04
你可以尝试像这样的东西
DELETE FROM sometable WHERE FIND_IN_SET(idfield, @param)不知道这是否可以工作(并且现在还不能访问mysql实例进行测试)。基本上问题是,如果您将一个逗号分隔的值列表传入一个参数,那么它将只是存储过程中的一个字符串,执行WHERE id IN ('1,2,3')将会失败,因为这只是一个简单的字符串,与WHERE id IN (1,2,3)完全不同。find_in_set()函数应该会处理这个问题。
https://stackoverflow.com/questions/7194658
复制相似问题