我正在尝试编写一个程序来更新给定列名中的值,其中用户 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
放在引号中。
SET @s = CONCAT('UPDATE ',@table,' SET ', @columns, ' = 1');
否则,您会将 @columns
与 1
进行比较,并连接 1
或 0
(可能是总是 0
,因为我怀疑 SQL 中有一个名为 1
的列,这会创建无效的 SQL。
请注意,上述代码只会更新一列。如果 @columns
应该包含 3 列,则需要在查询中使用 GROUP_CONCAT
来设置它。
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);
我怀疑您还需要向此 SQL 添加一个 WHERE
子句,以便它只更新给定 ID 的行。正如目前所写,它将更新所有行。
您需要像这样编写查询的事实表明您的数据标准化不正确。每个首选项不应位于不同的列中,而应位于表的不同行中,键类似于 (user_id, setting_name)
。
关于mysql - 动态MySQL更新语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27625337/