MySQL备份表(如果存在)

时间:2010-06-04 21:17:02

标签: sql mysql

我正在尝试编写一个脚本,如果表a存在,它会将表a中的所有数据复制到表b中。表b是与表a完全相同的结构,如果它存在,尽管它可能不存在。我可以使用以下语句进行复制:INSERT INTO 'B' SELECT * FROM 'A',但我不知道在哪里使用IF EXISTS,或者我甚至可以确定是否执行插入。我试图在SQL中执行此操作,因为它将从命令行以.sql脚本的形式运行。

3 个答案:

答案 0 :(得分:2)

仅限MySQL:

DROP PROCEDURE IF EXISTS myupdate;
DELIMITER //
CREATE PROCEDURE myupdate ()
BEGIN 
DECLARE found VARCHAR(64);
SET found = (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = Database() AND TABLE_NAME = 'A');
IF found = 'types' THEN
   INSERT INTO B SELECT * FROM A;
   SELECT 'A into B';
ELSE 
   SELECT 'A not found';
END IF;
END;//
DELIMITER ;
CALL myupdate();
DROP PROCEDURE myupdate;

扩展到您喜欢比较INFORMATION_SCHEMA.COLUMNS中的列定义以获取A& B如果你需要更好的控制。

答案 1 :(得分:1)

我已经接受了Wrikken的答案,但我将其作为我的最终代码。我需要重用他为多个表提供的过程,所以我稍微修改了它。它假设已经创建了备份表。

DROP PROCEDURE IF EXISTS tableUpdate;
DELIMITER //
CREATE PROCEDURE tableUpdate(name VARCHAR(32))
BEGIN
DECLARE cnt tinyint(1);
DECLARE btable VARCHAR(36);
SET btable = CONCAT(name,'BAK');
SET cnt = (SELECT COUNT(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TAA' AND TABLE_NAME = name);
IF cnt > 0 THEN
   SET @q:= CONCAT('INSERT INTO ',CONCAT(btable,CONCAT(' SELECT * FROM ',name)));
   PREPARE stmt FROM @q;
   EXECUTE stmt;
   COMMIT;
ELSE
   SELECT 'No update necessary.';
END IF;
END;//
DELIMITER ;
CALL tableUpdate('A');
DROP PROCEDURE tableUpdate;

答案 2 :(得分:0)

您可以通过执行以下操作来执行此操作:

select count(*) from my_tables where table_name='b'; 
If count>0 then 
update b...; 
else 
create table b; 
insert into my_tables(table_name) values('b'); 
insert into b...; 
end if;