2009-08-22 8 views
1

hi J'ai un problème pour insérer des données dans plusieurs tables. J'ai définir la clé primaire & clé de référence dans les tableaux maintenant je veux insérer des données dans les deux tableaux en une seule requête ....... comment puis-je faire cela ........... ????? ?? Votre langue prend-elle en charge la construction INSERT ALL?Insérer des données dans plusieurs tables

Répondre

0

Si oui, c'est le meilleur moyen de le faire. En fait c'est le seul moyen. J'ai posté un exemple de cette construction dans another SO thread (cet exemple de syntaxe vient d'Oracle SQL).

L'autre option consiste à créer une procédure stockée transactionnelle qui insère un enregistrement dans la table de clé primaire, suivi d'un enregistrement dans la table de référence.

1

Voici à quoi servent les transactions. Le langage SQL standard n'autorise pas l'insertion d'une seule instruction dans plusieurs tables à la fois. La bonne façon de le faire est:

-- begin transaction 
insert into table 1 ... 
insert into table 2 ... 
commit 
0

et 1 de votre choix de le faire est d'utiliser ORM (comme Hibernate, NHibernate) la vous faites votre objet et définir d'autres rapport à elle et, enfin, juste enregistrer l'objet principal , comme:

A a; 
B b; 
C c; 
a.set(b); 
a.set(c); 
DAO.saveOrUpdate(a); 

vous devez remarquer votre DAO.saveOrUpdate (a); ligne de code fonctionne tout simplement avec mise en veille prolongée, mais il insérer des données dans 3 tableau A, B, C.

4

Votre question n'est pas exactement clair sur ce problème particulier est. Je vois trois possibilités: 1.
Vous voulez insérer dans deux tables wiht une seule instruction INSERT
2. Vous voulez faire deux inserts, mais sans rien d'autre pouvoir « entrer au milieu »
3. vous souhaitez insérer dans une table, puis obtenir la clé primaire à insérer dans la deuxième table


la réponse à 1. est simple:

You can't. 


La réponse à 2. est tout aussi simple:

BEGIN TRANSACTION 
    INSERT INTO <table1> (a,b,c) VALUES (1,2,3) 
    INSERT INTO <table2> (a,b,c) VALUES (1,2,3) 
COMMIT TRANSACTION 


La réponse à 3. a plusieurs possibilités. Chacun dépend exactement de ce que vous voulez faire. Très probablement, vous voulez utiliser SCOPE_IDENTITY() mais vous pouvez également rechercher @@identity et IDENT_CURRENT() pour comprendre les différentes options et complexités.

BEGIN TRANSACTION 

    INSERT INTO <dimension_table> (name) 
     VALUES ('my new item') 

    INSERT INTO <fact_table> (item_id, iteam_value) 
     VALUES (SCOPE_IDENTITY(), 1) 

COMMIT TRANSACTION 
Questions connexes