Back (Current repo: scraps)

random scraps and notes that are useful to me
To clone this repository:
git clone https://git.viktor1993.net/scraps.git
Log | Download | Files | Refs

copy_schema_struct.sql (2394B)


USE some_schema;

-- May need to add DEFINER 
DROP PROCEDURE IF EXISTS `copy_schema_with_config`;

CREATE PROCEDURE copy_schema_with_config(IN inOldDB VARCHAR(256), IN inNewDB VARCHAR(256), IN copyTables INT(1))
  BEGIN

    DECLARE v_finished INTEGER DEFAULT 0;
    DECLARE v_tname varchar(100) DEFAULT "";

    DECLARE currentTable CURSOR FOR
      SELECT `table_name`
      FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_SCHEMA = inOldDB
            and TABLE_TYPE='BASE TABLE';

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1;
    -- Should be able to delete tables even if they have foreign keys
    SET FOREIGN_KEY_CHECKS = 0;
    set @result=NULL;

    -- Create new schema if it doesn't yet exist
    SET @create = CONCAT('CREATE SCHEMA IF NOT EXISTS ',inNewDB,';');
    PREPARE create_schema FROM @create;
    EXECUTE create_schema;
    DEALLOCATE PREPARE create_schema;

    -- Loop over tables in the old schema
    OPEN currentTable;
    clone_tables: LOOP

      -- Get the next table name
      FETCH currentTable INTO v_tname;

      -- Leave the Loop if we're done
      IF v_finished = 1 THEN LEAVE clone_tables;
      END IF;

      -- Drop tables in target DB schema if they already exist
      SET @drop = CONCAT("DROP TABLE IF EXISTS `" , inNewDB, "`.`", v_tname,"`;");
      PREPARE stmt FROM @drop;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;

      -- Clone the table from the origin
      SET @sql = CONCAT("CREATE TABLE `", inNewDB, "`.`", v_tname, "` LIKE `", inOldDB, "`.`", v_tname, "`;");
      PREPARE clone_table FROM @sql;
      EXECUTE clone_table;
      DEALLOCATE PREPARE clone_table;

      -- Optionally clone some data
      -- maybe change this to a for each in kind of thing besides config
      IF (copyTables > 0 && v_tname = 'config') THEN
        SET @data = CONCAT("INSERT INTO `", inNewDB, "`.`", v_tname, "` SELECT * FROM `", inOldDB, "`.`", v_tname, "`;");
        PREPARE clone_data FROM @data;
        EXECUTE clone_data;
        DEALLOCATE PREPARE clone_data;
      END IF;

      -- Give the user some result message
      SET @result = IFNULL(CONCAT(@result,',',v_tname),v_tname);

    END LOOP clone_tables;

    -- Close cursor

    CLOSE currentTable;
    SET FOREIGN_KEY_CHECKS = 1;
    -- Print result message
    SELECT CONCAT("Copied schema structure from ", inOldDB, " to ", inNewDB, ": ", @result);

  END;