32
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_NAME = 'email_subscription' AND COLUMN_NAME = 'subscribe_all')
  THEN 
  ALTER TABLE email_subscription
  ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1,
  ADD COLUMN subscribe_category varchar(512) DEFAULT NULL;

たくさんの例を見ました。しかし、このクエリは機能しません。次のエラーが発生しました。

エラー1064(42000):SQL構文にエラーがあります。1行目の「IFNOTEXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =」)の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

4

6 に答える 6

32

ホストからプロシージャの作成または実行の許可が与えられていない場合は、PREPARE / EXECUTEを使用してスキーマをクエリすることで、これを行う別の方法を見つけたと思います。

SET @s = (SELECT IF(
    (SELECT COUNT(*)
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE table_name = 'table_name'
        AND table_schema = DATABASE()
        AND column_name = 'col_name'
    ) > 0,
    "SELECT 1",
    "ALTER TABLE table_name ADD col_name VARCHAR(100)"
));

PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
于 2013-05-06T18:55:51.160 に答える
24

クエリのプロシージャを作成できます。

DELIMITER $$
CREATE PROCEDURE Alter_Table()
BEGIN
    DECLARE _count INT;
    SET _count = (  SELECT COUNT(*) 
                    FROM INFORMATION_SCHEMA.COLUMNS
                    WHERE   TABLE_NAME = 'email_subscription' AND 
                            COLUMN_NAME = 'subscribe_all');
    IF _count = 0 THEN
        ALTER TABLE email_subscription
            ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1,
            ADD COLUMN subscribe_category varchar(512) DEFAULT NULL;
    END IF;
END $$
DELIMITER ;
于 2013-01-17T15:09:27.560 に答える
3

MySQLでMSSQLServer構文を使用しています。

于 2013-01-17T15:05:40.040 に答える
3

単一のMySQLステートメントでこれを実現するための同等の構文はありません。

似たようなものを手に入れるには、次のいずれかを行うことができます

1)ALTER TABLEを使用して列を追加しようとし、その名前の列がすでにテーブルに存在する場合はMySQLにエラーを発生させます。

2)information_schema.columnsビューを照会して、その名前の列がテーブルに存在するかどうかを確認します。

table_schemaとtable_nameを実際にチェックする必要があることに注意してください。

SELECT column_name
  FROM information_schema.columns 
 WHERE table_schema = 'foo'
   AND table_name   = 'email_subscription'
   AND column_name  = 'subscribe_all'

それに基づいて、ALTERTABLEを実行するかどうかを決定します

于 2013-01-17T15:13:58.837 に答える
2

また、データベース名の条件を追加して、列の存在を確認します。

これを試して:

DELIMITER $$
CREATE PROCEDURE sp_AlterTable()
BEGIN
    IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
                   WHERE TABLE_SCHEMA = 'dbName' AND 
                         TABLE_NAME = 'email_subscription' AND 
                         COLUMN_NAME = 'subscribe_all') THEN 
       ALTER TABLE email_subscription
          ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1,
          ADD COLUMN subscribe_category VARCHAR(512) DEFAULT NULL;
    END IF; 
END $$
DELIMITER ;
于 2013-01-17T15:13:45.000 に答える
0
SET @s = (SELECT IF(
    (SELECT COUNT(column_name)
          FROM INFORMATION_SCHEMA.COLUMNS
          WHERE table_name = 'oc_bitcoin_wallets_receive'
          AND table_schema = 'k_opencart2'
          AND column_name = 'test3'
    ) > 0,
    "SELECT 1",
    "ALTER TABLE `oc_bitcoin_wallets_receive` ADD COLUMN `test3` INT NOT NULL AFTER `test2`;"
));
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

編集の値:oc_bitcoin_wallets_receive-テーブル名、k_opencart2-データベース名、test3-新しい列の名前、oc_bitcoin_wallets_receive-2番目の場所のテーブルtest3-2番目の場所の列、test2-新しい列の前の列の名前。

于 2017-05-19T21:44:09.797 に答える