Abd*_*man 6 mysql stored-procedures
我有一个主数据库。我想制作主数据库的重复数据库,但不是刚刚指定的所有表。
我在逗号分隔的字符串中有这些表名。
tbl1, tbl2, tbl7, tbl10等等。
我正在尝试创建一个传递它的存储过程,它new DB name创建数据库并将给定的表复制到它。到目前为止,我有两件事,但我不知道如何遍历它。我是 DB 新手,所以请指导如何实现这一点。
(注)我还没有发现是否可以使用数组来循环,表名也可以存储在数组变量中,因为表名是硬编码的。
以下是我想要的 sudo 代码。
CREATE DATABASE %param_db%;
@tables = 'tbl1, tbl2, tbl7, tbl10';
loop through @tables as table_name
CREATE TABLE %param_db.table_name% LIKE Master.%table_name%;
End loop
Run Code Online (Sandbox Code Playgroud)
以下是在存储过程中进行布局的步骤
这是存储过程
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`TableCookieCutter` $$
CREATE PROCEDURE `test`.`TableCookieCutter`
(
SourceDB VARCHAR(64),
TargetDB VARCHAR(64),
TableList VARCHAR(1024)
)
BEGIN
# Create the Target DB
SET @sql = CONCAT('CREATE DATABASE IF NOT EXISTS ',TargetDB);
PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
# Strip Table List of Blanks
# Enclose each table in quotes
SET @table_list = CONCAT('''',REPLACE(REPLACE(TableList ,' ',''),',',QUOTE(',')),'''');
# Count the number of tables in the list
SET @table_stub = REPLACE(@table_list,',','');
SET @array_count = LENGTH(@table_list) - LENGTH(@table_stub) + 1;
# Loop through list of tables, creating each table
SET @x = 0;
WHILE @x < @array_count DO
SET @x = @x + 1;
SET @sql = CONCAT('SELECT ELT(',@x,',',@table_list,') INTO @tb');
PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
SET @sql = CONCAT('CREATE TABLE ',TargetDB,'.',@tb,' LIKE ',SourceDB,'.',@tb);
PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
END WHILE;
END $$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22283 次 |
| 最近记录: |