1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

SQL INSERT IF NOT EXISTS --> erster Durchlauf

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von johamu, 13 Februar 2020 um 11:57 Uhr.

  1. johamu

    johamu Neuer Benutzer

    Hallo,
    vermutlich nur eine Kleinigkeit, aber
    1) Ich habe eine Sourcetabelle, einfaches Beispiel:
    Source-Tab, eine Spalte mit int, enthält die Werte 1,2,3,2,

    2) Ich habe eine leere Zieltabelle, ebenfalls nur eine Spalte von Typ int

    Die Spalte soll in beiden Tabelle A heißen.

    Ich möchte in die Ziel-Tabelle nur jene Werte aus Source einfügen, die noch nicht enthalten sind.

    INSERT INTO Dest (A)
    SELECT A FROM Source
    WHERE not exists (SELECT A FROM Dest D WHERE D.A = A)

    Wenn die Zieltabelle leer ist, wird mir die "2" doppelt eingefügt.
    Bei einem zweiten Durchlauf funktioniert es wie erartet.

    Es scheint so, als würde das "WHERE not exists ..." nur jene Einträge berücksichtigen, die schon in der Datenbank sind und jene, die sozusagen unterwegs sind, nicht beachten .

    In meinem Fall kann ich das Problem einfach mit einem SELECT DISTINCT lösen.

    Gibt es auch andere Lösungsmöglichkeiten?

    Danke!!
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Nun ja, wenn Du da in dest(a) nur unique Werte haben willst kannst das auch definieren, in Deinem Beispiel:

    Code:
    test=*# alter table dest add constraint a_unique unique(a);
    ALTER TABLE
    test=*# insert into dest(a) select a from source where not exists(select distinct a from dest d where d.a=a);
    ERROR:  duplicate key value violates unique constraint "a_unique"
    DETAIL:  Key (a)=(2) already exists.
    test=*# insert into dest(a) select distinct a from source where not exists(select distinct a from dest d where d.a=a);
    INSERT 0 3
    test=*#
    
    Dann würde der erste Versuch scheitern, weil 2 doppelt eingefügt werden würde. Hilft das weiter?
     
  3. johamu

    johamu Neuer Benutzer

    Danke für die Antwort.

    Die Lösung stellt die Datenintegrität sicher aber ich müsste dann auch irgendwie den Fehler abfangen, denn es soll nicht abgebrochen werden sondern mit dem Rest fortgesetzt werden (d.h. alle noch nicht existierenden sollen eingefügt werden, die existierenden sollen ignoriert werden).

    Schöne Grüße, johamu
     
  4. akretschmer

    akretschmer Datenbank-Guru

    das erreichst Du ja mit dem DISTINCT. Datenbanken arbeiten mit Mengen und in Transaktionen...
     
  5. johamu

    johamu Neuer Benutzer

    Genau, darum eben DISTINCT und das vorgeschlagene UNIQUE ist sozusagen die Absicherung, die Alarmanlage.

    Ich habe nur wegen der Performance von DISTINCT bedenken und wollte es mit eventuellen vorhanden Alternativen (die ich nicht kenne) vergleichen.
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Nun ja, über wie viele Datebn reden wir? Indexe können auch helfen.
     
  7. johamu

    johamu Neuer Benutzer

    Mit Indizes experimentiere ich gerade - Datensatzanzahl: 100.000 aufwärts
    In so einem frühen Stadium interessiere ich mich halt auch für alternative konzeptuelle Ansätze ...
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden