我正在尝试创建一个包含部分数据而不是全部数据的数据库。我不需要1M+记录来做我需要的事情,所以我只需要10000行就可以了。
我想我可以使用一个存储过程遍历所有的表,手动创建每个表并只插入10000行。
我创建了一个这样的存储过程
CREATE DEFINER=`root`@`10.%` PROCEDURE `createNewDatabase`(in db_name varchar(100), in new_db_name varchar(100))
BEGIN
DECLARE finish INT DEFAULT 0;
DECLARE tbl VARCHAR(100);
DECLARE cur_tables CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_schema = db_name AND TABLE_TYPE='BASE TABLE';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finish = 1;
OPEN cur_tables;
my_loop: LOOP
FETCH cur_tables INTO tbl;
IF finish = 1 THEN
LEAVE my_loop;
END IF;
SET @str = CONCAT('DROP TABLE IF EXISTS `', new_db_name, '`.`' , tbl , '`; CREATE TABLE `', new_db_name, '`.`' , tbl , '` LIKE `', db_name , '`.`', tbl,'`; INSERT INTO `', new_db_name , '`.`' , tbl, '` SELECT * FROM `', db_name ,'`.`', tbl , '` LIMIT 10000;');
PREPARE stmt FROM @str;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP;
CLOSE cur_tables;
END然后我这样调用它,调用createNewDatabase('baseTable','newTable');
但是我运行了这个过程,得到了以下错误
Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'CREATE TABLE `newTable`.`account_addresses` LIKE `baseTable`.`account_addres' at line 1如果我在prepare语句之前添加了以下两行
SELECT @str;
LEAVE my_loop;我得到了以下查询,如果我手动执行它们,这些查询可以正常工作
DROP TABLE IF EXISTS `newTable`.`account_addresses`;
CREATE TABLE `newTable`.`account_addresses` LIKE `baseTable`.`account_addresses`;
INSERT INTO `newTable`.`account_addresses` SELECT * FROM `newTable`.`account_addresses` LIMIT 10000;
CREATE TABLE `newTable`.`account_addresses` LIKE `baseTable`.`account_addresses`; INSERT INTO `newTable`.`account_addresses` SELECT * FROM `baseTable`.`account_addresses` LIMIT 10000;我在这里做错了什么?为什么它会出错?
发布于 2015-10-23 08:44:25
引用mysql关于PREPARE的文档
文本必须表示单个语句,而不是多个语句。
您正在尝试执行drop table和create table语句,在%1准备好的语句中插入记录,但这是不允许的。对于这3个命令有3个单独的预准备语句。
https://stackoverflow.com/questions/33292881
复制相似问题