动态MySQL更新声明

时间:2014-12-23 17:37:51

标签: mysql dynamic-sql

我正在尝试编写一个程序,用于更新给定列名中的值,其中用户ID等于给定的用户ID。

_strong_1是一个包含列名的变量,例如:' category_1',例如。

SELECT COLUMN_NAME FROM information_schema.`COLUMNS` C 
WHERE table_name = 'subscribers_preferences' AND COLUMN_NAME LIKE _strong_1 INTO @columns;

SET @table = 'subscribers_preferences';
SET @s = CONCAT('UPDATE ',@table,' SET ', @columns = 1);

PREPARE stmt FROM @s;
EXECUTE stmt;

' SET @s ='内有错误。声明。我可以使用一个简单的SELECT语句来处理它,但UPDATE很棘手。

提前致谢。

1 个答案:

答案 0 :(得分:1)

您需要将= 1放在引号中。

SET @s = CONCAT('UPDATE ',@table,' SET ', @columns, ' = 1');

否则,您将@columns1进行比较,并将10连接起来(可能总是0,因为我怀疑你有1 SQL的名为@columns的列,它创建了无效的SQL。

请注意,上面的代码只会更新一列。如果GROUP_CONCAT应该包含3列,则需要在设置它的查询中使用SELECT GROUP_CONCAT(CONCAT(column_name, ' = 1')) AS @columns FROM information_schema.columns WHERE table_name = 'subscribers_preferences' and column_name LIKE _strong_1; SET @table = 'subscribers_preferences'; SET @s = CONCAT('UPDATE ',@table,' SET ', @columns);

WHERE

我怀疑您还需要为此SQL添加(user_id, setting_name)子句,以便它只更新给定ID的行。如目前所写,它将更新所有行。

您需要编写这样的查询这一事实表明数据的规范化程度不正确。它们不是将每个首选项选项放在不同的列中,而应该是表的不同行,其中的键类似于{{1}}。