2010-11-30 6 views
1

Je suis en train d'exécuter cette requête:erreur de syntaxe SQL

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

Et je reçois le message d'erreur suivant:

Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser à proximité 'IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS OU TABLE_NAME = 'articles'' à la ligne 1

J'utilise MySQL 5.1. quelque chose, donc je ne pense pas information_schema pas défini est la question. Toutes les idées?

Merci pour votre aide!

+0

Comment essayez-vous d'exécuter la requête? –

+0

@OMG Poneys: peu importe comment il le dirige. Dans cette requête mysql essaie d'utiliser DML 'IF' dans le contexte de DDL (du moins je le pense). Selon la documentation - il n'est pas possible d'écrire de tels DDL conditionnels. – zerkms

Répondre

2

vous ne pouvez pas le faire. IF EXISTS n'a de sens que pour la création de tables/bases de données

Si vous avez besoin de déposer la colonne si il existe - vous pouvez utiliser

ALTER IGNORE TABLE DROP COLUMN ... 

Remarque sur IGNORE.

0

Vous avez plusieurs options.

Une option consiste à exécuter la commande ALTER TABLE et à ignorer l'erreur si la colonne n'existe pas. Une autre option plus proche dans l'esprit de votre tentative originale est de vider le DDL sous condition vers un script SQL sur le disque si la colonne existe, puis de générer ce script SQL pour exécuter le DDL (le cas échéant).

Voici un exemple:

-- 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