首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将同一字段的值列表发送到MySQL存储过程

问将同一字段的值列表发送到MySQL存储过程
EN

Stack Overflow用户
提问于 2011-08-26 01:31:43
回答 3查看 1.3K关注 0票数 2

我有一个MySQL表,ID作为主键,其他字段作为这个问题的不重要字段。我想要做的是通过将要删除的is列表作为参数发送到存储过程来删除多条记录。

我知道如何手动执行此操作(直接在PHP中构建查询),但我希望避免这样做,并直接在DB中执行所有SQL。

我试着搜索,但是找不到任何相关的问题。如果这是重复的,很抱歉。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-26 01:54:50

我将+1赋给了@Marc B,以便巧妙地使用FIND_IN_SET()。它将不能使用索引,因此性能不会很好,但它应该可以工作。

另一个可以工作的solution (但也会很慢,因为它不能使用索引):

代码语言:javascript
复制
DELETE FROM sometable 
WHERE CONCAT(',', param, ',') LIKE CONCAT('%,', idfield, ',%')

@Andrej L描述的解决方案并不是真正的参数绑定,而是在preparing之前将存储过程参数插入到动态SQL字符串中。

代码语言:javascript
复制
SET sql = CONCAT('DELETE FROM sometable WHERE idfield IN (', param, ')');
PREPARE stmt FROM sql;
EXECUTE stmt;

即使参数值看起来像一个逗号分隔的整数列表,也不能用一个参数将值列表参数化。

插值可以工作,它将从索引中受益,但要小心过滤字符串,使其只包含数字和逗号。否则,您将引入SQL注入的重大风险(揭穿一些人声称的存储过程本质上更安全的说法)。

票数 1
EN

Stack Overflow用户

发布于 2011-08-26 01:38:37

根据http://dev.mysql.com/doc/refman/5.1/en/faqs-stored-procs.html#qandaitem-B-4-1-17,你不能直接这么做。

但我认为你可以尝试下面的技巧:

  1. 在php中创建你的in字符串,像'id1,id2,id3‘。
  2. 使用准备好的语句来绑定这个字符串。

也许这会有帮助。

票数 3
EN

Stack Overflow用户

发布于 2011-08-26 01:39:04

你可以尝试像这样的东西

代码语言:javascript
复制
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()函数应该会处理这个问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7194658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档