Question

J'ai table, que j'insère des enregistrements dans une autre table. Quel est le meilleur moyen de marquer un enregistrement inséré, afin qu’il ne soit pas tenté de le réinsérer?

Était-ce utile?

La solution

Vous pouvez voir la différence entre les deux tables comme suit:

  

SELECT * FROM tableFoo
    LEFT JOIN tableBar ON tableFoo.commonColumn = tableBar.commonColumn
    WHERE tableBar.commonColumn EST NULL

L'idée est que les deux tables disposent d'une colonne sur laquelle faire correspondre, et que les enregistrements joints lorsque la colonne a la valeur null sont ceux qui ne figurent que dans tableBar.

Cela s’explique par le fait que les jointures de gauche renvoient des enregistrements, même si l’une des tables a des valeurs null, contrairement à une jointure interne qui fait l’inverse.

Après avoir obtenu ces enregistrements, vous pouvez les insérer en fonction des identifiants renvoyés.

Autres conseils

insérez uniquement les enregistrements qui ne figurent pas dans votre autre table, à l'aide d'une clause NOT EXISTS ou en joignant à gauche et en filtrant tous les enregistrements not-NULL du résultat

Le meilleur moyen consiste à utiliser une clé commune (ou à faire en sorte que la clé de la première table soit la partie principale de la clé de la seconde table). De cette façon, il vous suffit de sélectionner les lignes de la TABLE1 où NOT EXISTS n'apparaît pas dans le tableau 2.

La meilleure alternative, si vous devez transformer la clé d’une manière ou d’une autre, consiste à utiliser un déclencheur d’insertion sur TABLE1: lorsque vous insérez des lignes, le déclencheur s’active et vous pouvez insérer des données dans TABLE2. Cela présente l’avantage et l’inconvénient d’utiliser une seule transaction. C’est un avantage en ce que vous conservez la cohérence des données, un inconvénient si TABLE2 est utilisé à des fins de rapport ou à d’autres fins non essentielles.

NE décidez PAS d'utiliser un indicateur dans TABLE1 indiquant que la ligne a été insérée. C’est moche, tant du point de vue logique que physique, car vous couplez des données de la table à un processus qui utilise la table.

Il existe deux méthodes que j'utilise fréquemment. En fonction de la nature de la table, une solution peut être meilleure qu'une autre. Toutefois, si vous optez pour la deuxième étape, vous aurez probablement l'occasion d'améliorer la structure de votre table.

1.) Assurez-vous que vos tables sont indexées et ont une bonne clé primaire. Sélectionnez tous les enregistrements de table1 où la clé primaire n'existe pas dans table2. Cela fonctionne pour les tables normalisées

2.) Si vos tables ne sont pas normalisées et ne possèdent pas de bonnes clés, vous pouvez ajouter une Date de traitement à la table1. Insérez tous les enregistrements ayant une valeur ProcessDate nulle, puis définissez la valeur ProcessDate sur la date / heure actuelle. Vous devrez simplement vous assurer qu'aucun nouvel enregistrement n'a été inséré dans table1 pendant la durée de l'insertion dans table2.

Sans connaître la structure de votre table, il est difficile de donner une bonne réponse.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top