web-dev-qa-db-ja.com

存在する場合はテーブルを変更し、存在しない場合は作成します

アップデーターでもあるインストーラーを実行する必要があります。インストーラーは、いくつかのテーブルが存在したか、いくつかの列を失ったか、または構造が最新であるために変更する必要がないかに関係なく、mysqlデータベースの特定のスキーム/構造を持つことができる必要があります。

ALTERCREATEのエレガントな組み合わせを作成するにはどうすればよいですか?

「ADD ... IF ... Duplicate」のようなものがあるに違いないと思っていました

テーブルAがあるとします。あるクライアントでは、テーブルに1つの列-A1があり、別のクライアントには同じテーブルがありますが、列A1と列A2があります。

Sqlコマンドで両方のクライアントのテーブルAにA1、A2、A3の3つの列を保持させます。

繰り返しますが、私のスクリプトは、mysqlにダンプするsqlファイルです。

どうすればいいのですか?ありがとう:-)

19
Alon_T

MySQL INFORMATION_SCHEMA救助のためのデータベース:

-- First check if the table exists
IF EXISTS(SELECT table_name 
            FROM INFORMATION_SCHEMA.TABLES
           WHERE table_schema = 'db_name'
             AND table_name LIKE 'wild')

-- If exists, retreive columns information from that table
THEN
   SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT
     FROM INFORMATION_SCHEMA.COLUMNS
    WHERE table_name = 'tbl_name'
      AND table_schema = 'db_name';

   -- do some action, i.e. ALTER TABLE if some columns are missing 
   ALTER TABLE ...

-- Table does not exist, create a new table
ELSE
   CREATE TABLE ....

END IF;

詳しくは:

UPDATE:

もう1つのオプションは、おそらくもっと簡単な方法ですが、既存のテーブルを削除し、新しいスキーマでテーブルを再作成することです。これを行うには、次のものが必要です。

  1. 一時テーブル、既存のテーブルの正確なコピーを作成します
  2. 一時テーブルに古いテーブルのデータを入力します
  3. 古いテーブルをドロップする
  4. 新しいスキーマで新しいテーブルを作成します
  5. 新しいテーブルに一時テーブルからの情報を入力します
  6. 一時テーブルを削除します。

したがって、SQLコードでは:

CREATE TABLE old_table_copy LIKE old_table;

INSERT INTO old_table_copy
SELECT * FROM old_table;

DROP TABLE old_table;

CREATE TABLE new_table (...new values...);

INSERT INTO new_table ([... column names from old table ...])
SELECT [...column names from old table ...] 
FROM old_table_copy;

DROP TABLE old_table_copy;

実際、最後のステップである「一時テーブルをドロップします。」、しばらくスキップできます。念のために、古いテーブルの何らかのバックアップ、「ジャストインケース」が必要になります。

詳しくは:

20
GregD

コーディング言語を使用している場合:

SHOW TABLES LIKE 'myTable'

値を返す場合はalterを呼び出し、そうでない場合はcreateを呼び出します

1
We0