我正在尝试创建一个过程,该过程将填充表,直到有一定数量的元素。
目前我有
CREATE PROCEDURE PopulateTable(
IN dbName tinytext,
IN tableName tinytext,
IN amount INT)
BEGIN
DECLARE current_amount INT DEFAULT 0;
SET current_amount = SELECT COUNT(*) FROM dbName,'.',tableName;
WHILE current_amount <= amount DO
set @dll=CONCAT('INSERT INTO `',dbName,'`.`',tableName,'`(',
'`',tableName,'_name`) ',
'VALUES('',tableName,'_',current_amount,'')');
prepare stmt from @ddl;
execute stmt;
SET current_amount = current_amount + 1;
END WHILE;
END;
因此,我试图做的是,一旦用户调用该过程,函数将检查并查看存在多少当前元素,并填充剩余的元素。
我遇到的第一个问题是,我不知道如何计算元素,所以我的SELECT COUNT(*) FROM dbName,'.',tableName;
不起作用。
我还想提一个建议,因为我是数据库的新手,如果我所做的是正确的,或者有更好的方法吗?
此外,如果这有任何帮助的话,我试图对表进行此操作的表只有2个字段,其中一个是id,它是自动递增的,是主字段,另一个是我正在填充的profile_name。
感谢所有人的帮助!
-
首先,如果您试图执行粘贴的代码,我认为您将遇到分隔符问题。过程声明分隔符必须与过程代码中使用的分隔符不同(此处为";")。您必须使用DELIMITER语句;
-
您的过程属于一个模式;我不确定您是否可以从其他shema查询表(尤其是在没有USE语句的情况下);
-
如果您的数据库包含不应该通过过程填充的表,这不是一个好主意;
-
如果您有数量有限的相关表,我认为最好为每个表定义一个过程。通过这种方式,表名将在每个过程代码中显式显示,并避免使用准备好的语句;
-
注意"amount"参数:如果我将INT的最大值作为amount传递,你确定你的服务器可以处理请求吗?
-
我认为你应该使用'<'而不是'<='在您的WHILE条件下
-
如果要插入大量行,执行"分组"插入,或者生成包含所有行的临时表(例如使用MEMORY引擎),并执行唯一的insert来选择临时表的内容,都会获得更好的性能。