OVH Cloud OVH Cloud

Problème INSERT dans Sous-tables ?

11 réponses
Avatar
[ Olivier ]
Bonjour,

J'ai un problème typique débutant, soit :

pour un étudiant, je dois insérer dans la base tous ces jours de présences
(dans une table 'PRESENCES')
puis en même temps inserer le details des activitées réalisées lors de cette
journée (dans 'DETAILS_PRESENCES')

mon problème est que la table 'DETAILS_PRESENCES' contient une clé étrangère
qui fait référence à une colonne autoincrement de la table 'PRESENCES'

Seulement, au moment de créer ma requete, je ne connais pas la valeur
qu'aura cette colonne et donc je ne peux pas renseigner cette valeur dans ma
sous table 'DETAILS_PRESENCES'

Comment faites-vous ?

J'espère avoir été clair dans mes explications ?

Merci
Olivier

10 réponses

1 2
Avatar
Fred BROUARD
[ Olivier ] a écrit :
Bonjour,

J'ai un problème typique débutant, soit :

pour un étudiant, je dois insérer dans la base tous ces jours de présences
(dans une table 'PRESENCES')
puis en même temps inserer le details des activitées réalisées lors de cette
journée (dans 'DETAILS_PRESENCES')

mon problème est que la table 'DETAILS_PRESENCES' contient une clé étrangère
qui fait référence à une colonne autoincrement de la table 'PRESENCES'

Seulement, au moment de créer ma requete, je ne connais pas la valeur
qu'aura cette colonne et donc je ne peux pas renseigner cette valeur dans ma
sous table 'DETAILS_PRESENCES'



si, utilisez @@IDENTITY.
Cette variable de session contient le dernier autoincrément généré
quelque soit la table dans laquelle l'insertion vient d'être faite.

Lisez le tutorial Transact SQL que j'ai élaboré :
http://sqlpro.developpez.com/cours/sqlserver/transactsql/#L2.5


Comment faites-vous ?

J'espère avoir été clair dans mes explications ?

Merci
Olivier







A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Thiery QUELNER
Si tu passes par de la programmation, tu inseres dans un premier temps ton
enregistrement dans la table principale PRESENCES.
Puis tu executes la requête select @@identify qui va te renvoyer la derniere
valeur incrément qui a été utilisée. Pour finir, tu insères tes
enregistrements dans la table détail avec la valeur récupérée dans ton champ
reposant sur la clé étrangere.
Naturellement, tu dois insérer un enregistrement après l'autre.

Cordialement
Avatar
[ Olivier ]
>>Naturellement, tu dois insérer un enregistrement après l'autre.





justement, pour l'instant je prépare coté client toutes mes requetes et
ensuite je les envoie toutes dans un transaction d'où mon problème.

Mais bon s'il faut les envoyer une par une .... je vais le faire.

Merci
Olivier


"Thiery QUELNER" a écrit dans le message de news:
%
Si tu passes par de la programmation, tu inseres dans un premier temps ton
enregistrement dans la table principale PRESENCES.
Puis tu executes la requête select @@identify qui va te renvoyer la
derniere valeur incrément qui a été utilisée. Pour finir, tu insères tes
enregistrements dans la table détail avec la valeur récupérée dans ton
champ reposant sur la clé étrangere.
Naturellement, tu dois insérer un enregistrement après l'autre.

Cordialement



Avatar
Fred BROUARD
[ Olivier ] a écrit :
Naturellement, tu dois insérer un enregistrement après l'autre.





justement, pour l'instant je prépare coté client toutes mes requetes et
ensuite je les envoie toutes dans un transaction d'où mon problème.

Mais bon s'il faut les envoyer une par une .... je vais le faire.



Mais non, utilisez une procédure stiockée, c'est faitpour ça !

CREATE PROCEDURE P_I_DATA @DATA1, @DATA2, @DATA3...
AS

INSERT INTO PRESENCE VALUES (@DATA1, @DATA2 ... )

INSERT INTO PRESENCE_DETAIL VALUES (@@IDENTIY, @DATA3, ... )

A +


Merci
Olivier


"Thiery QUELNER" a écrit dans le message de news:
%
Si tu passes par de la programmation, tu inseres dans un premier temps ton
enregistrement dans la table principale PRESENCES.
Puis tu executes la requête select @@identify qui va te renvoyer la
derniere valeur incrément qui a été utilisée. Pour finir, tu insères tes
enregistrements dans la table détail avec la valeur récupérée dans ton
champ reposant sur la clé étrangere.
Naturellement, tu dois insérer un enregistrement après l'autre.

Cordialement









--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Gilles LE BARBIER
Je ne sais pas si c'est très propre

Les présences tu en connais le nombre ?
Les détails tu connais le nombre par présence ?

tu peux retirer l'autoincrément le temp d'insérer tes presences et tes
détails

et tu remet en place l'autoincrement

qu'est ce que vous en pensez les PRO

Gilles




pour un étudiant, je dois insérer dans la base tous ces jours de présences
(dans une table 'PRESENCES')
puis en même temps inserer le details des activitées réalisées lors de
cette journée (dans 'DETAILS_PRESENCES')

mon problème est que la table 'DETAILS_PRESENCES' contient une clé
étrangère qui fait référence à une colonne autoincrement de la table
'PRESENCES'

Seulement, au moment de créer ma requete, je ne connais pas la valeur
qu'aura


Avatar
[ Olivier ]
>> Mais non, utilisez une procédure stiockée, c'est fait pour ça !





OK je vais donc voir ceci.
par contre, sur votre site :
http://sqlpro.developpez.com/cours/sqlaz/techniques/#L6

vous prenez un exemple dans lequels vous n'avez a inserer qu'une adresse. Et
si vous aviez plusieures adresses ?
Quels type de paramêtres prendriez-vous ?

Vous feriez une boucle While ... mais sur quel param ?

Auriez-vous un exemple si vous deviez inserer plusieur adresse pour le même
Client ?
toujours dans cette procédure stockée.

Merci beaucoup

Olivier




"Fred BROUARD" a écrit dans le message de news:

[ Olivier ] a écrit :
Naturellement, tu dois insérer un enregistrement après l'autre.





justement, pour l'instant je prépare coté client toutes mes requetes et
ensuite je les envoie toutes dans un transaction d'où mon problème.

Mais bon s'il faut les envoyer une par une .... je vais le faire.



Mais non, utilisez une procédure stiockée, c'est faitpour ça !

CREATE PROCEDURE P_I_DATA @DATA1, @DATA2, @DATA3...
AS

INSERT INTO PRESENCE VALUES (@DATA1, @DATA2 ... )

INSERT INTO PRESENCE_DETAIL VALUES (@@IDENTIY, @DATA3, ... )

A +


Merci
Olivier


"Thiery QUELNER" a écrit dans le message de news:
%
Si tu passes par de la programmation, tu inseres dans un premier temps
ton enregistrement dans la table principale PRESENCES.
Puis tu executes la requête select @@identify qui va te renvoyer la
derniere valeur incrément qui a été utilisée. Pour finir, tu insères tes
enregistrements dans la table détail avec la valeur récupérée dans ton
champ reposant sur la clé étrangere.
Naturellement, tu dois insérer un enregistrement après l'autre.

Cordialement









--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************


Avatar
Fred
dans : news:,
[ Olivier ] écrivait :

Bonjour,



Bonsoir,

J'ai un problème typique débutant, soit :


[...]
Seulement, au moment de créer ma requete, je ne connais pas la valeur
qu'aura cette colonne et donc je ne peux pas renseigner cette valeur
dans ma sous table 'DETAILS_PRESENCES'

Comment faites-vous ?



J'utilise beaucoup la clause OUTPUT sous SQL 2005, mais comme tu ne
précises pas quelle base tu utilises je ne sais pas si cela te sera
utile.

--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)
http://www.mailfusible.com/?3kA6ftaCvT
Avatar
Olivier
SQL 2005

Merci
Olivier


"Fred" a écrit dans le message de news:

dans : news:,
[ Olivier ] écrivait :

Bonjour,



Bonsoir,

J'ai un problème typique débutant, soit :


[...]
Seulement, au moment de créer ma requete, je ne connais pas la valeur
qu'aura cette colonne et donc je ne peux pas renseigner cette valeur
dans ma sous table 'DETAILS_PRESENCES'

Comment faites-vous ?



J'utilise beaucoup la clause OUTPUT sous SQL 2005, mais comme tu ne
précises pas quelle base tu utilises je ne sais pas si cela te sera utile.

--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)
http://www.mailfusible.com/?3kA6ftaCvT


Avatar
Fred BROUARD
[ Olivier ] a écrit :
Mais non, utilisez une procédure stiockée, c'est fait pour ça !





OK je vais donc voir ceci.
par contre, sur votre site :
http://sqlpro.developpez.com/cours/sqlaz/techniques/#L6

vous prenez un exemple dans lequels vous n'avez a inserer qu'une adresse. Et
si vous aviez plusieures adresses ?



Emboitez vos procédures stockées :

la proc stock insère client insère 1 client et fait appel à proc stock
insère 1 adresse.
Si plusieurs adresse appelée ensuite la proc stock insère 1 adresse.

Quels type de paramêtres prendriez-vous ?

Vous feriez une boucle While ... mais sur quel param ?

Auriez-vous un exemple si vous deviez inserer plusieur adresse pour le même
Client ?
toujours dans cette procédure stockée.

Merci beaucoup

Olivier



A +





"Fred BROUARD" a écrit dans le message de news:

[ Olivier ] a écrit :
Naturellement, tu dois insérer un enregistrement après l'autre.




justement, pour l'instant je prépare coté client toutes mes requetes et
ensuite je les envoie toutes dans un transaction d'où mon problème.

Mais bon s'il faut les envoyer une par une .... je vais le faire.


Mais non, utilisez une procédure stiockée, c'est faitpour ça !

CREATE PROCEDURE P_I_DATA @DATA1, @DATA2, @DATA3...
AS

INSERT INTO PRESENCE VALUES (@DATA1, @DATA2 ... )

INSERT INTO PRESENCE_DETAIL VALUES (@@IDENTIY, @DATA3, ... )

A +

Merci
Olivier


"Thiery QUELNER" a écrit dans le message de news:
%
Si tu passes par de la programmation, tu inseres dans un premier temps
ton enregistrement dans la table principale PRESENCES.
Puis tu executes la requête select @@identify qui va te renvoyer la
derniere valeur incrément qui a été utilisée. Pour finir, tu insères tes
enregistrements dans la table détail avec la valeur récupérée dans ton
champ reposant sur la clé étrangere.
Naturellement, tu dois insérer un enregistrement après l'autre.

Cordialement







--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************








--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Fred BROUARD
Arnaud CLERET a écrit :
Bonsoir,

Préférez l'utilisation de scope_identity() plutot que @@Identity afin d'être
sur de récupérer la dernière valeur générée dans le scope actuel et non de
manière globale.




Ce que vous dites est faux !

@@IDENTITY est propre à la session donc il n'y a pas de problème, c'est
la dernière insertion d'autoincrément dans la session et quelque soit la
table.
SCOPE_IDENTITY est plus gourmand en terme de ressources et sa visibilité
est limité au module (proc stock, trigger, fonction ou lot) et toujours
dans la session.

A +


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
1 2