2009-10-22 10 views
0

J'ai une table dans laquelle 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 l'insérer à nouveau?Marqueur inséré

+2

exemple de code est apprécié;) – Ossi

Répondre

2

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

SELECT * FROM tableFoo
LEFT JOIN TableBar SUR tableFoo.commonColumn = tableBar.commonColumn
OÙ tableBar.commonColumn IS NULL

L'idée est que les deux tables ont une colonne sur laquelle s'appuyer, et les enregistrements qui sont joints lorsque la colonne est nulle sont les enregistrements qui sont uniquement présents dans tableBar. La raison pour laquelle cela fonctionne est que les jointures à gauche retourneront des enregistrements même si l'une des tables a des valeurs nulles, contrairement à une jointure interne, qui fait l'opposé. Après avoir récupéré ces enregistrements, vous pouvez les insérer en fonction des ID renvoyés.

+0

Je n'ai pas de colonne commune pour le moment, je pourrais essayer d'en ajouter un, qu'en est-il de combiner 2 colonnes pour le rendre unique (l'un d'eux serait l'horodatage) serait-ce possible? – Ossi

+0

Les deux tables doivent avoir des colonnes uniques, telles qu'un ID. Vous pouvez vous inscrire sur cette colonne. –

+0

N'hésitez pas à poser plus de questions si vous ne comprenez pas:] et merci de l'accepter! –

1

insérer uniquement les enregistrements non dans l'autre table, soit en utilisant une clause NOT EXISTS ou en se joignant à gauche et à filtrer tous les not-NULL enregistrements du résultat

1

La meilleure façon est d'utiliser une clé commune (ou avoir la clé de la première table est la partie principale de la clé de la seconde table). De cette façon, vous sélectionnez simplement les lignes de TABLE1 où NON EXISTE dans le tableau 2.

La meilleure alternative, si vous avez besoin de transformer la clé d'une manière ou d'une autre, est d'utiliser un déclencheur d'insertion sur TABLE1: lorsque vous insérez des lignes, le déclencheur se déclenche et vous pouvez insérer des données dans TABLE2. Cela a l'avantage - et aussi l'inconvénient - d'utiliser une seule transaction. C'est un avantage en ce sens que vous conservez la cohérence des données, un inconvénient si TABLE2 est utilisé pour les rapports ou à d'autres fins non essentielles. NE PAS décider d'utiliser un indicateur dans TABLE1 qui indique que la ligne a été insérée. C'est moche d'une conception à la fois logique et physique, parce que vous êtes en train de coupler des données dans la table à un processus qui utilise la table.

+0

Que voulez-vous dire "avoir la clé de la première table soit la partie principale de la clé de la deuxième table"? – Ossi

0

Il existe deux méthodes que j'utilise fréquemment. Selon la nature de la table, une façon peut être meilleure qu'une autre, mais si vous allez aveC# 2, il y a probablement des opportunités pour améliorer la structure de votre table. 1.12) Assurez-vous que vos tables sont indexées et qu'elles ont une bonne clé primaire. Sélectionnez tous les enregistrements de table1 où la clé primaire n'existe pas dans table2. Cela fonctionnera pour les tables normalisées

2.) Si vos tables ne sont pas normalisées et n'ont pas de bonnes clés, vous pouvez ajouter ProcessedDate à table1. Insérez tous les enregistrements qui ont un ProcessDate null puis définissez le ProcessDate au datetime en cours. Vous devrez simplement vous assurer qu'aucun nouvel enregistrement n'a été inséré dans la table 1 pendant la période d'insertion dans table2.

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