2016-08-15 115 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