2009-11-10 6 views
3

Supposons que j'ai deux tabels, A et B, chacun avec trois colonnes (A.id, A.title, A.text et B.id, B.a_id, B.text). B.a_id est une clé étrangère liée à A.id. Maintenant, supposons qu'il y ait un enregistrement dans A (1, 'foo', 'bar') et 2 enregistrements dans B (1, 1, 'test') et (2, 1, 'test1'). Ma question est, existe-t-il une méthode standard de copier l'enregistrement dans A, et, en même temps copier tous les enregistrements de B qui se rapportent à A. Donc, supposons que je crée un nouvel enregistrement dans A (2, ' foo ',' bar ') basé sur (1,' foo ',' bar '), existe-t-il une méthode qui crée deux nouveaux enregistrements dans B (3, 2,' test ') et (4, 2, 'test1)?Copier plusieurs enregistrements en utilisant des clés étrangères

Je n'ai jamais utilisé de déclencheurs auparavant, est-ce le bon moment pour commencer à le faire? Ou est-ce une question très stupide?

Répondre

4

Ce n'est pas une question stupide. Cependant, je crois que ce n'est pas possible avec du SQL pur, ou seulement avec une syntaxe exotique que je ne connais pas. Copie de lignes ne sont pas le problème (en supposant que id est auto_increment):

insert into A (title, text) select title, text from A where id = XY 

Cependant, alors vous devez trouver le dernier ID d'insertion pour dupliquer les enregistrements B. Voyons voir:

insert into B (a_id, text) select LAST_INSERT_ID(), text from B where a_id = XY 

Hm ... peut-être que cela fonctionne, mais je suis un peu sceptique à propos de LAST_INSERT_ID(). De toute façon, je ne pense pas que cela puisse être fait avec une seule déclaration.

Laissez-moi savoir comment il va

Tom

+0

Grand, cela fonctionne! Merci! C'est déjà beaucoup plus facile que la méthode que j'ai utilisée (en utilisant des requêtes séparées select et insert). –

+0

Cool. Je n'ai jamais utilisé cette insertion combinée ... sélectionnez la syntaxe avant, soit. Merci de me le faire savoir. –

+0

Cela fonctionne même si d'autres processus mettent à jour les tables car '' LAST_INSERT_ID() '' regarde l'ID inséré par le processus en cours et ignore les ID insérés par d'autres processus. – kmoser

Questions connexes