Mysql

MySQL 在儲存過程中將所有視圖從一個數據庫複製到另一個數據庫

  • December 18, 2021

我有一個儲存過程,它將所有表從一個數據庫複製到另一個數據庫,但單獨遍歷每個表(因為查詢)。

我需要添加到儲存過程以複製原始數據庫中的所有視圖,但我不完全確定如何循環遍歷此查詢的結果:

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以獲取視圖程式碼。但是,這將在程式碼中包含數據庫名稱。您需要解析輸出,替換該數據庫名稱,然後使用PREPAREand執行動態語句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。

引用自:https://dba.stackexchange.com/questions/214726