2016-08-15 17 views
2

テーブル内のいくつかの列を除くすべての列の値をクリアする必要があります。私はSET句内の結果セットから列名を使用するかどうかは確認していない次のクエリ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=?; 

を使用して、これら2以外のすべてのカラム名を取得すると考えることができます。

私が考えることのできる他の方法は、両方のクエリを別々に実行するか、明示的にすべての列名を渡すことでアプリケーションレベルでクエリを構築することですが、テーブルが変更されると非決定的になります。

UPDATE

このクエリが使用されるシナリオは、ユーザーがアプリケーションで削除された場合への参照するように、そのユーザーのすべての列が姓と名を除いてクリアされていますアプリケーション内の削除されたユーザは、スレッドなどのコメントのように存在します。すべてのSQLクエリを含むプレーンテキストファイルでSpring JDBCを使用します。可能であれば、これを1つのクエリーで行いたい場合は、アプリケーションレベルでクエリーを作成したいと思います。

+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に設定されます。

関連する問題