2010-06-10 16 views
2

Si j'ai une table parent et enfant dans MySQL liée à une clé étrangère, est-il possible d'utiliser une instruction SQL pour déplacer certaines lignes de Parent et les lignes connexes de Child dans des tables d'archivage (par exemple Parent_Archive et Child_Archive) d'une manière atomique?Archive Hiérarchie de tables parent/enfant dans MySQL

Répondre

1

Utiliser les transactions - leur but est de rendre la série d'instructions SQL atomique.

Par exemple (pas très optimisé - peut être améliorée avec une table temporaire):

START TRANSACTION; 

INSERT Child_Archive 
SELECT DISTINCT 
Child.* FROM Child, Parent 
WHERE Child.FK = Parent.PK 
    AND Parent.something=11; 

DELETE Child WHERE FK IN (
    SELECT DISTINCT PK FROM Parent WHERE Parent.something=11); 

INSERT Parent_Archive 
SELECT DISTINCT * FROM Parent WHERE Parent.something=11; 

DELETE Parent WHERE Parent.something=11; 

COMMIT; 
+0

En supposant Parent_Archive et Child_Archive ont les mêmes contraintes FK en tant que parent et enfant, ne sera pas le premier insert échec parce que la ISN mère n'est-ce pas encore? –

+0

@Eric J. - Il le fera. Je ne suis pas sûr de savoir pourquoi une table d'archives aurait une telle contrainte, cependant (je n'en mettrais pas une). Si c'est la conception, la solution est celle que j'ai mentionnée ci-dessus comme étant "plus performante" - vous devez d'abord créer une table temporaire de PK/FK à archiver, puis réordonner les requêtes ci-dessus dans l'ordre que vous avez P_A, insérer dans C_A, supprimer C, supprimer P) – DVK