2016-08-15 65 views
2

我需要清除除表中几列以外的所有列中的值。我能想到用下面的查询如何在MySQL的SET子句中使用SELECT子句?

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

UPDATE accountuser 
SET ?? 
WHERE accountuserid=?; 

检索除了这两个都列名的,我不知道如何从内部SET条款中的结果使用列名。

我能想到的其他方法是在应用程序级别构建查询,方法是单独运行这两个查询或显式传递所有列名称,但在表更改时变为非确定性。

UPDATE

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

+3

您无法直接在另一个查询中真正使用一个查询的结果作为关键字/标识符。你可以建立一个新的查询字符串,然后执行它,例如'@sql = concat('update .... set',@somevar,'= someval'); exec @ sql;' –

+0

你是否愿意创建一个临时表和一个全新的表与旧的表相同? –

+0

您是否也在应用程序中动态创建表?根据我的经验,这指向了一个被破坏的数据模型。您不应该这样做,否则您应该能够编写列表列表而不会期望它发生更改。如果这没有意义,那么向我展示您正在使用的模式,并且我会针对您的具体情况进行解释。 – Hogan

回答

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; 

注:附上NOT IN子句中的primary key column。否则它也会被设置为NULL