0

現在、データベースをバージョン管理下に置く方法を探しています。これを実現するために、1 回だけ実行できる (対応する元に戻す) 決定論的な手順が必要でした。

小さなバグだらけの最初のスクリプトの作成に問題があります。

3 つの主要部分は次のとおりです。

クエリを実行する条件 (フィールドが存在しない場合)

SELECT *
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'my_database'
  AND TABLE_NAME = 'my_table'
  AND COLUMN_NAME = 'full_name'

テーブルの変更:

ALTER TABLE
  my_table
  ADD full_name VARCHAR(255) NOT NULL;

そして最後にデータ移行

UPDATE candidat dest JOIN candidat src ON dest.id = src.id
      SET dest.full_name = CONCAT(src.first_name, ' ', IF(src.middle_name='', '', CONCAT(src.middle_name, ' ')), src.last_name);

私はこの形式でこれを機能させようとしています:

DELIMITER $$
DROP PROCEDURE IF EXISTS migration_001;

CREATE PROCEDURE migration_001()

BEGIN
  IF NOT EXISTS (
    SELECT *
    FROM information_schema.COLUMNS
    WHERE TABLE_SCHEMA = 'my_database'
      AND TABLE_NAME = 'my_table'
      AND COLUMN_NAME = 'full_name') 
   THEN

     ALTER TABLE
      my_table
      ADD full_name VARCHAR(255) NOT NULL;

    UPDATE candidat dest JOIN candidat src ON dest.id = src.id
          SET dest.full_name = CONCAT(src.first_name, ' ', IF(src.middle_name='', '', CONCAT(src.middle_name, ' ')), src.last_name);
  END IF
END;
$$

私が得ている現在のエラー:

1064 : ...  right syntax to use near 'CREATE PROCEDURE migration_001() BEGIN IF NOT EXISTS ( SELECT * ' at line 3

これを解決するために誰かが私を正しい方向に向けることができますか?

ところで私は使用して5.5.16-log - MySQL Community Serverいます。

4

1 に答える 1

1

の順序を変更します

DELIMITER $$

DROP PROCEDURE IF EXISTS migration_001;

現在、プロシージャを削除するために間違った区切り文字を使用しています。

于 2013-01-10T21:36:26.150 に答える