のMySQL 5.5(エンジンMyISAM)の2つのテーブルのスキーマを比較するときに、欠落しているカラムを追加することを目標としています。引数p_table1
は、p_table2
が比較され、 "同期化"されるモデルテーブル名です。MySQL 2つのテーブルのスキーマを同期する手順
呼び出されると、何も起こりません。エラーも何も起こりません。私はいくつかの変数を記録しようとしましたが、どちらもうまくいきませんでした。
コードに間違いがありますか?
CREATE PROCEDURE synchronize_tables(p_table1 VARCHAR(64), p_table2 VARCHAR(64), p_schema_name VARCHAR(64))
BEGIN
DECLARE v_done INT default false;
DECLARE v_actual_column_name VARCHAR(64);
DECLARE v_does_columns_exist INT default true;
DECLARE v_column_type LONGTEXT;
DECLARE v_column_default LONGTEXT;
DECLARE v_is_nullable VARCHAR(3);
DECLARE v_cur CURSOR FOR
SELECT column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = p_table1
AND table_schema = p_schema_name;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
OPEN v_cur;
read_loop: LOOP
FETCH v_cur INTO v_actual_column_name;
IF v_done THEN
LEAVE read_loop;
END IF;
SELECT count(*) INTO v_does_columns_exist
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = p_table2
AND table_schema = p_schema_name
AND column_name = v_actual_column_name;
IF NOT v_does_columns_exist THEN
SELECT column_type, COLUMN_DEFAULT, IS_NULLABLE
INTO v_column_type, v_column_default, v_is_nullable
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = p_table1
AND table_schema = p_schema_name
AND column_name = v_actual_column_name;
SET @stmt_text = CONCAT('ALTER TABLE ', p_schema_name, '.', p_table2,
' ADD COLUMN ', v_actual_column_name, ' ', v_column_type, ' ', IF(upper(v_is_nullable) = 'NO', 'NOT NULL', ''),
' DEFAULT ', v_column_default);
prepare v_stmt FROM @stmt_text;
execute v_stmt;
deallocate prepare v_stmt;
END IF;
END LOOP;
CLOSE v_cur;
END;
END
あなた自身ではなく、[mysqldbcompare](https://dev.mysql.com/doc/mysql-utilities/1.5/en/mysqldbcompare.html)を使用したことはありますか? –
@BillKarwin私は比較するdbモデルを持っていないので、私はmysqldbcompareを書き直そうとしていません。実際、私は、レイガシコードベースとそれほど良いプロジェクトの選択肢に対して何らかの対処法を実行しようとしています。問題は、そのストアドプロシージャが期待どおりに動作しない理由です。つまり、ここで問題となるのは、プロシージャを正しく動作させることができず、ドキュメンテーションを見ても何が起きているのか分からないということです。 – susanoobit