目標是在比較MySQL 5.5(引擎MyISAM)中兩個表的模式時添加缺失的列。參數p_table1
是p_table2
將被比較和「同步」的模型表名稱。MySQL同步兩個表的模式的過程
當它被調用時,沒有任何反應,沒有錯誤,沒有任何東西。我試圖記錄一些變量,但它也沒有奏效。
代碼有什麼問題?
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我不想重寫mysqldbcompare,因爲我沒有db模型來比較。事實上,我正在嘗試針對滯後代碼庫做一些解決方法,並且它不是很好的項目選擇。問題是:爲什麼存儲過程沒有按預期運行?我的意思是,這裏的問題是我無法使程序正常工作,儘管我努力查看文檔,但我不知道發生了什麼。 – susanoobit