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