0 votes

Comment insérer un nouvel enregistrement dans la table A lorsque la table A dépend de la table B et vice versa ?

Je ne suis pas sûr que ce soit bien conçu, si ce n'est pas le cas, s'il vous plaît, conseillez-moi sur la façon de le faire.

  • J'utilise Sql Server 2008

Je l'ai fait :

TableA (TableA_ID int identity PK, Value varchar(10), TableB_ID PK not null)
TableB (TableB_ID int identity PK, Value varchar(10), TableA_ID PK not null)

L'objectif est simple :

  • La TableA ne peut avoir des lignes que s'il y a au moins une ligne dans la TableB associée à la TableA ;
  • Et pour chaque ligne du tableau B, il doit y avoir une ligne qui lui est associée dans le tableau A) ;

La TableA est la "Table des parents", et la TableB est la "Table des enfants", c'est quelque chose comme, un parent doit avoir 1 ou plusieurs enfants, et chaque enfant peut avoir seulement 1 parent.

C'est bien ça ?

Le problème que j'ai est que lorsque j'essaie de faire une déclaration INSERT, si c'est correct, comment dois-je faire l'INSERT ? désactiver temporairement les contraintes ?

Merci !

Le problème que j'ai est que lorsque j'essaie d'insérer

1voto

DForck42 Points 4421
TableA (TableA_ID int identity PK, Value varchar(10))
TableB (TableB_ID int identity PK, Value varchar(10), TableA_ID not null)

En tant que parent, la table a n'a pas besoin de faire référence à la table b, puisque la table be exige qu'il y ait un champ dans la table a. C'est ce qu'on appelle une relation un à plusieurs.

Ainsi, dans le tableau a, vous pourriez avoir ces valeurs :

1 a
2 b
3 c

et dans le tableau b, vous pourriez avoir ceci :

1 asdf 1
2 sdfg 1
3 pof 2
4 dfgbsd 3

maintenant vous pouvez faire une requête pour montrer les données de la table a avec ceci :

select b.TableB_ID, b.Value, a.TableA_ID, a.Value
from TableB b
inner join TableA
on b.TableA_ID=a.TableA_ID

0voto

cjk Points 27463

Les parents ne dépendent pas des enfants. Vous devez supprimer votre référence au tableau B dans le tableau A.

0voto

ahains Points 1684

Vous avez une dépendance circulaire. Ces contraintes ne fonctionnent pas vraiment bien pour l'application déclarative, il faudrait désactiver les contraintes à chaque fois que l'on veut insérer.

0voto

HLGEM Points 54641

C'est une exigence inhabituelle. Si je devais m'y coller (et j'insisterais vraiment pour m'assurer qu'il s'agit bien d'une exigence), je la concevrais de cette manière :

Créez une clé étrangère régulière de la table a à la table b avec a comme parent et b comme enfant.

Ajoutez un déclencheur à la table a qui insère un enregistrement dans la table b s'il n'en existe pas lorsqu'un enregistrement de la table a est inséré. Ajoutez un autre déclencheur à la table b qui supprime l'enregistrement de la table a si le dernier enregistrement lié dans la table b est supprimé.

Une autre solution serait de placer les insertions dans les deux tables dans une procédure stockée. Supprimez tous les droits d'insertion dans la table, sauf par le biais de la procédure. Vous aurez toujours besoin de la relation de clé étrangère de tablea à table b et du déclencheur sur table b pour vous assurer que si le dernier enregistrement est supprimé, l'enregistrement de table a est supprimé. Mais vous pouvez vous passer du déclencheur sur la table a dans ce cas.

J'utiliserais le premier scénario, sauf s'il y a des informations dans la table b qui ne peuvent pas être trouvées à partir du déclencheur sur la table a, par exemple un ou plusieurs champs obligatoires qui n'ont pas de valeur que vous pouvez trouver à partir de la table a.

0voto

Tyrroll Points 11

Je placerais les insertions dans une procédure : désactiver les contraintes, insérer les données, activer les contraintes. Vous devrez peut-être vous assurer que c'est la seule transaction en cours pendant que les contraintes sont désactivées.

On pourrait y parvenir en rendant le niveau d'isolation SERIALIZABLE, mais cela pourrait à son tour massacrer votre concurrence.

Kev

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X