現在、データベースをバージョン管理下に置く方法を探しています。これを実現するために、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
います。