Frage

Ich habe Tabelle, die ich Aufzeichnungen an einem anderen Tisch bin einfügen. Was ist der beste Weg Datensatz eingefügt zu markieren, damit es nicht wieder zu werden eingefügt versucht werden?

War es hilfreich?

Lösung

Sie können den Unterschied zwischen den beiden Tabellen sehen wie folgt:

  

SELECT * FROM tableFoo
    LEFT JOIN tableBar ON tableFoo.commonColumn = tableBar.commonColumn
    WO tableBar.commonColumn IS NULL

Die Idee ist, dass beide Tabellen eine Spalte, oben auf entsprechen, und die Datensätze, die miteinander verbunden sind, wenn die Spalte der Datensätze null sind, die in tableBar nur vorhanden sind.

Der Grund, warum dies funktioniert, weil links Willen gibt Datensätze verbindet, auch wenn eine der Tabellen Nullwerte hat, im Gegensatz zu einem inneren Verknüpfung, die das Gegenteils des Fall ist.

Nachdem Sie die Datensätze zu erhalten, können Sie auf den IDs einfügen, basierend zurückgegeben.

Andere Tipps

einfügen nur Datensätze nicht in der anderen Tabelle, entweder mit einer NOT EXISTS Klausel oder durch linke Füge- und Filterung all not-NULL Datensätze aus dem Ergebnis

Der beste Weg ist es, einen gemeinsamen Schlüssel zu verwenden (oder haben die Schlüssel der ersten Tabelle werden der führende Teil des Schlüssels der zweiten Tabelle). Auf diese Weise wählen Sie einfach die Reihen von TABLE1 wo NICHT VORHANDEN in Tabelle 2.

Die beste Alternative, wenn Sie den Schlüssel in irgendeiner Weise zu transformieren müssen, ist ein Insert-Trigger auf TABLE1 verwenden: wenn Sie Zeilen dort einfügen, wird der Trigger ausgelöst, und Sie können Daten in TABLE2 einfügen. Dies hat den Vorteil - und auch den Nachteil - von einer einzigen Transaktion. Es ist ein Vorteil, dass Sie die Datenkonsistenz beibehalten, ein Nachteil, wenn TABLE2 ist für die Berichterstattung oder andere nicht wesentliche Zwecke verwendet werden.

Entscheiden Sie nicht eine Flagge in TABLE1 zu verwenden, die die Zeile eingefügt wurde, anzeigt. Dies ist hässlich sowohl von einem logischen und physikalischen Entwurf, da Sie Daten in der Tabelle zu einem Prozess sind Kopplung, die die Tabelle verwendet wird.

Es gibt zwei Methoden, die ich häufig verwenden. Je nach Art der Tabelle, kann ein Weg besser als der andere sein, aber wenn Sie gehen mit # 2, gibt es Ihre Tabellenstruktur besser wahrscheinlich Chancen zu machen.

1.) Stellen Sie sicher, dass Ihre Tabellen sind indiziert und hat einen guten Primärschlüssel. Wählen Sie alle Datensätze aus Tabelle 1, wo der Primärschlüssel nicht in table2 nicht existiert. Diese Arbeiten werden für normalisierte Tabellen

2.) Wenn Ihre Tabellen nicht normalisiert sind und keine gute gute Tasten, können Sie eine ProcessedDate zu tabelle1 hinzufügen. Legen Sie alle Datensätze, die ein Null-ProcessDate dann den ProcessDate die aktuellen Datumzeit haben. Sie müssen nur sicherstellen, dass, dass keine neuen Datensätze in table1 während der Zeit eingeführt wurden Sie in table2 eingefügt wurden.

Ohne Ihre Tabellenstruktur zu wissen, es ist schwierig, eine gute Antwort zu geben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top