Mysql
MySQL 在儲存過程中將所有視圖從一個數據庫複製到另一個數據庫
我有一個儲存過程,它將所有表從一個數據庫複製到另一個數據庫,但單獨遍歷每個表(因為查詢)。
我需要添加到儲存過程以複製原始數據庫中的所有視圖,但我不完全確定如何循環遍歷此查詢的結果:
SHOW FULL TABLES IN stations WHERE TABLE_TYPE LIKE 'VIEW';
儲存過程:
USE station; DROP PROCEDURE IF EXISTS updateStation; DELIMITER // CREATE PROCEDURE updateStation (IN stationName VARCHAR(255)) BEGIN # stationList DROP TABLE IF EXISTS station.stationList; CREATE TABLE station.stationList LIKE stations.stationList; INSERT INTO station.stationList SELECT s.* FROM stations.stationList s WHERE s.hostName = stationName; # pinTypes DROP TABLE IF EXISTS pinTypes; CREATE TABLE station.pinTypes LIKE stations.pinTypes; INSERT INTO station.pinTypes SELECT p.* FROM stations.pinTypes p; # pinModes DROP TABLE IF EXISTS pinModes; CREATE TABLE station.pinModes LIKE stations.pinModes; INSERT INTO station.pinModes SELECT p.* FROM stations.pinModes p; # Copy All Views FOR SELECT TABLES IN stations WHERE TABLE_TYPE LIKE 'VIEW' DROP TABLE IF EXISTS ?; CREATE TABLE station.? LIKE stations.?; END // DELIMITER ;
也許是這樣的?:
DECLARE cur CURSOR FOR SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES where TABLE_SCHEMA = 'stations' AND ENGINE IS NULL; DECLARE done INT DEFAULT 0; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN cur; read_loop: LOOP FETCH cur INTO tableName; IF done THEN LEAVE read_loop; END IF; DROP TABLE IF EXISTS 'station'.tableName; CREATE TABLE 'station'.tableName LIKE 'stations'.tableName; END LOOP;
關閉目前;
您需要呼叫
SHOW CREATE VIEW
以獲取視圖程式碼。但是,這將在程式碼中包含數據庫名稱。您需要解析輸出,替換該數據庫名稱,然後使用PREPARE
and執行動態語句EXECUTE
。儲存過程可能是最困難的管理方式。例如,您可以 mysqldump 可以在一行中將視圖從一個數據庫轉儲/載入到另一個數據庫:https ://stackoverflow.com/questions/1658204/backing-up-views-with-mysql-dump
Flyway 和 Liquibase 等其他工具也可以幫助進行模式管理。
您可以從INFORMATION_SCHEMA.VIEWS獲取有關視圖的資訊
SELECT TABLE_SCHEMA, TABLE_NAME, VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS
如果要將視圖放置在另一個模式(MySQL 中的數據庫)中,請替換上面的 TABLE_SCHEMA。