如何在MySQL中的SET子句中使用SELECT子句?

时间:2016-08-15 14:18:09

标签: mysql sql sql-update

除了表格中的几列之外,我需要清除所有列中的值。我可以考虑使用以下查询检索除这两个列之外的所有列名称

SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_NAME`='accountuser' AND COLUMN_NAME NOT IN('firstname', 'lastname');

UPDATE accountuser
SET ??
WHERE accountuserid=?;

我不确定如何在SET子句中使用结果集中的列名。

我能想到的其他方法是在应用程序级别通过单独运行两个查询或显式传递所有列名来构造查询,但是当表更改时它变得不确定。

更新

将使用此查询的方案是,当在应用程序中删除用户时,将清除该用户的所有列,除了名字和姓氏,以便对应用程序中已删除用户的任何引用仍然存在,像线程中的注释等。我们使用Spring JDBC和一个包含所有SQL查询的纯文本文件。因此,如果可能的话,我希望在单个查询中使用它,如果没有,则希望在应用程序级别构建查询。

1 个答案:

答案 0 :(得分:0)

如果您想在这些列中设置NULL

SET @sql := '';

SELECT 
CONCAT('UPDATE accountuser SET ',GROUP_CONCAT(COLUMN_NAME,'= NULL'),' WHERE accountuser = ', PUT_ACCOUNTUSER_ID_HERE)
INTO @sql
FROM information_schema.columns 
WHERE TABLE_SCHEMA ='YOUR_DATABASE_NAME'
AND TABLE_NAME='TABLE_NAME'
AND COLUMN_NAME NOT IN ('firstname','lastname');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE stmt;

注意:primary key column子句中包含NOT IN。否则它也会设置为NULL