MySQL:存在しない場合、どのように列を作成しますか?


13

テーブルが存在しない場合にのみ、テーブルの列を作成しようとしています。私は多くのことを研究しましたが、まだ解決策を見つけることができませんでした。

これは条件付きで列を作成することは本当に可能ですか?


私は好奇心が強い...列がすでに存在する場合にエラーで変更を失敗させるだけの何が問題になっていますか?
Derek Downey

実際、DB構造の変更に関連するすべてのクエリを含む.sqlファイルをクライアントに提供する必要があります。データベース全体を送信することはできません。私はそれらにdbの変更を送信したいだけです。そのsqlファイルにはさらに多くのクエリがあります。列の作成に関するこのクエリが失敗すると、すべてのクエリが失敗します。そのため、if条件を使用して列を作成します。
zzzzz 2017

データベースでサポートされている場合は、トリガーを使用できます。挿入する前に。
cybernard 2017

回答:


7

MySQLにALTER TABLEIF EXISTS仕様がありません。

定期的に実行する必要がある場合は、ストアドプロシージャまたはプログラミング言語を使用して次のことを実行できます。

疑似コード:

  • 以下のSQLを使用して、列が存在するかどうかを確認します。

    SELECT column_name FROM INFORMATION_SCHEMACOLUMNS WHERE TABLE_SCHEMA= [データベース名] AND TABLE_NAME= [テーブル名];

  • 上記のクエリが結果を返す場合は、列が存在することを意味します。それ以外の場合は、先に進んで列を作成できます。


MySQL / MariaDBでは、そのクエリを使用すると、column_name存在しないことを示すエラーが発生します。:私は、クエリの再定式SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='[Schema_name]' AND TABLE_NAME='[Table_name]' and column_name='[Column_name]';
イエス・アロンソアバド

2
MySQLと(私が思うに)MariaDBの両方で単純な0または1の回答の場合:SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='[Schema_name]' AND TABLE_NAME='[Table_name]' AND column_name='[Column_name]'
piojo

13

マリアDB 10.219には現在存在しています

ALTER TABLE test ADD COLUMN IF NOT EXISTS column_a VARCHAR(255);

おまけ、MODIFYでも機能します

ALTER TABLE test MODIFY IF EXISTS column_a VARCHAR(255);

3
>「MYSQL 5.5.5」?これは不正解です。これはMaria DB機能のみです。
エクスカリバー

1
訂正に感謝
Paroofkey

6

StackOverFlowの別の投稿で既に言及されているこのソリューションを使用できます:(参照:https : //stackoverflow.com/a/31989541/

MySQL-列が存在しない場合に列を追加するALTER TABLE:

SET @dbname = DATABASE();
SET @tablename = "tableName";
SET @columnname = "colName";
SET @preparedStatement = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
    WHERE
      (table_name = @tablename)
      AND (table_schema = @dbname)
      AND (column_name = @columnname)
  ) > 0,
  "SELECT 1",
  CONCAT("ALTER TABLE ", @tablename, " ADD ", @columnname, " INT(11);")
));
PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists;

2

これは私のために働きました:

    SELECT count(*)
    INTO @exist
    FROM information_schema.columns
    WHERE table_schema = 'mydatabase'
    and COLUMN_NAME = 'mycolumn'
    AND table_name = 'mytable' LIMIT 1;

    set @query = IF(@exist <= 0, 'ALTER TABLE mydatabase.`mytable`  ADD COLUMN `mycolumn` MEDIUMTEXT NULL',
    'select \'Column Exists\' status');

    prepare stmt from @query;

    EXECUTE stmt;

私はこれに行きました、ありがとう。
スチュアートマッキンタイア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.