2010-11-30 22 views
1

私はこのクエリを実行しようとしています:SQL構文エラー

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns 
WHERE table_name = 'MyTableName' AND column_name = 'ColumnInQuestion') 
THEN ALTER TABLE MyTableName DROP COLUMN ColumnInQuestion; 

をそして、私は次のようなエラーメッセージが出ます:あなたは、あなたのSQL構文でエラーが発生している

を。近くで使用する権利構文についてはMySQLサーバのバージョンに対応するマニュアルをチェック記事「『行1

で私は、MySQL 5.1を使用しています』 IFを(TABLE_NAME = information_schema.COLUMNS SELECT * FROMをEXISTS」。何か、私はINFORMATION_SCHEMAが定義されていないとは思わない問題である。任意のアイデア?

あなたの助けをありがとう!

+0

どのようにクエリを実行しようとしていますか? –

+0

@OMGポニー:それは彼がそれをどのように実行するかは関係ありません。このクエリでは、mysqlはDDLのコンテキストでDMLの 'IF'を使用しようとします(少なくとも私はそうそう思います)。ドキュメントによれば、そのような条件付きDDLを書くことはできません。 – zerkms

答えて

2

あなたがこれを行うことはできません。IF EXISTSはテーブルのみ/データベース

を作成するための意味があります

カラムを削除する必要がある場合ifそれが存在する - あなたがIGNORE

ALTER IGNORE TABLE DROP COLUMN ... 

注意を使用することができます。

0

あなたにはいくつかのオプションがあります。

1つのオプションは、ALTER TABLEコマンドを実行し、列が存在しない場合はエラーを無視することです。

元の試みに精通している別のオプションは、列が存在する場合は条件付きでディスク上のSQLスクリプトにDDLをダンプし、DDLを実行するSQLスクリプトをソースします。

はここに例を示します

-- delete the SQL script if it exists 
\! rm /tmp/drop_column.sql 

-- Conditionally dump the DDL to a SQL script if the column exists 
SELECT concat('ALTER TABLE ',table_schema,'.',table_name, 
' DROP COLUMN ',column_name,';') as sql_stmt 
into outfile '/tmp/drop_column.sql' 
FROM INFORMATION_SCHEMA.columns 
WHERE table_name = 'MyTableName' AND column_name = 'ColumnInQuestion'; 

-- execute the SQL script 
\. /tmp/drop_column.sql 

-- delete the SQL script from disk 
\! rm /tmp/drop_column.sql