我正在尝试动态地完成以下事情。
基本目标是将记录从第一个数据库表移动到第二个数据库表。 数据库表名称总是会因轮换而发生变化。 记录也会定期添加到第一个表中,因此我想定期调用此过程 带有参数第一个表、第二个表和第二个表最后一个元素的特殊 db1 id。所以使用这个id,我只能插入新条目。
为此,我正在尝试编写这样的程序。数据库是mysql。
DROP PROCECURE IF EXISTS `foo_bar`;
DELIMITER $$
CREATE PROCEDURE `foo_bar`(IN var_dbtable1 varchar(50), IN var_dbtable2 varchar(50))
BEGIN
--get db1_id of last record from second table
DECLARE v_lst_db1_id bigint(21);
SET @query1 = CONCAT("SELECT id INTO ", v_lst_db1_id, " FROM ", var_dbtable2, " ORDER BY id DESC LIMTI 1");
PREPARE stmt1 from @query1;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
-- insert records in db2 from db1 whose ids are greater than last id.
SET @query2 = CONCAT("INSERT INTO ", var_dbtable2, "(col1, col2, col3)
SELECT co1, col2, col3
FROM ", var_dbtable1, " WHERE id > ", v_lst_db1_id, "");
PREPARE stmt2 from @query2;
EXECUTE stmt2;
DEALLOCATE PREPARE stmt2;
END $$
DELIMTER ;
稍后我想调用这个程序
call foo_bar("foo.foo1", "bar.bar1");
但是这个程序似乎有问题。特别是第一个查询的一部分。我是不是漏掉了什么?
提前致谢。
更新: 错误消息:
您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在第 1 行“NULL”附近使用的正确语法
最佳答案
尝试这样:
SET @query1 = CONCAT("SELECT id INTO v_lst_db1_id FROM ", var_dbtable2, " ORDER BY id DESC LIMTI 1");
PREPARE stmt1 from @query1;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
您想要使用变量,而不是变量所保存的值。在本例中null
。
您的查询是
SELECT id INTO NULL FROM ...
关于Mysql 程序定期将数据从一个数据库移动到另一个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26841690/