2010-06-04 4 views
2

J'essaye d'écrire un script qui va copier toutes les données de la table a vers la table b si la table a existe. Le tableau b est exactement la même structure que la table a si elle existe, bien que ce ne soit pas le cas. Je suis capable de copier en utilisant la déclaration suivante: INSERT INTO 'B' SELECT * FROM 'A', mais je ne sais pas où utiliser IF EXISTS, ou si je peux même déterminer si je effectuer l'insertion. J'essaie de le faire en SQL seulement car il sera exécuté en tant que script .sql à partir de la ligne de commande.Table de sauvegarde MySQL si elle existe

+0

Pouvez-vous expliquer plus au sujet de votre cas d'utilisation? Pourquoi ne sauriez-vous pas, a priori, si 'B' existe? – VeeArr

+0

Il s'agit de mettre à jour la base de données des utilisateurs. Ceux sur une ancienne version n'auront pas de table du tout. Ceux sur la dernière version auront une table dont les données doivent être conservées – ashurexm

Répondre

2

MySQL seulement:

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; 

vous Extension au goût comparant la définition de la colonne dans INFORMATION_SCHEMA.COLUMNS A & B si vous besoin d'un contrôle plus précis.

+0

Très gentil, merci! J'ai trouvé que je devais mettre un 'COMMIT;' après 'INSERT INTO B SELECT * FROM A;' et cela a fonctionné juste ainsi. – ashurexm

+0

J'ai légèrement modifié votre code pour le rendre réutilisable pour plusieurs tables. – ashurexm

+0

Tables multiples? Hardcode Je présume, si vous avez un moyen d'interroger un nom de table dynamique, je serais tout ouïe (bien que du point de vue de la maintenance, le code de production devrait s'appuyer sur des tables et échouer de manière transparente bien sûr) – Wrikken

0

Vous pouvez le faire en procédant comme suit:

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; 
1

J'ai accepté la réponse de Wrikken mais j'utilise ceci comme mon code final. J'ai besoin de réutiliser la procédure qu'il a fournie pour plusieurs tables, donc je l'ai légèrement modifié. Il suppose que la table de sauvegarde a déjà été créée.

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; 
Questions connexes