mysql - 动态MySQL更新语句

标签 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 放在引号中。

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

否则,您会将 @columns1 进行比较,并连接 10(可能是总是 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/

相关文章:

javascript - 如何进行数据完整性和错误处理?

postgresql - 使用 regclass 的动态 SQL 的意外行为

sql-server - 是否可以使用带参数的 sp_executesql 发出 CREATE 语句?

postgresql - 将动态查询的结果转换为json

mysql - Mysql Group_concat 返回重复行

mysql - 在同一张表上更新后在触发器中更新表

mysql - 只有在mysql中不存在该过程时才创建存储过程

sql - 动态查询查找所有表oracle中所有表的DML事件

php - 3个日期范围之间的Mysql查询

python - mysql.connector 使用二进制值选择查询