Philip K.: Unique Index fuer eine Tabelle

Hallo,

Wie kann man folgendes Problem in SQLITE loesen? Eine Tablle wird erstelle mit einem Index in der Form:

CREATE UNIQUE INDEX IF NOT EXISTS aIndex ON aTable(col1,col2,col8,col9)

In die Tabelle werden daten eingelesen mit INSERT OR IGNORE

Dies sollte eigentlich verhindern, dass gewisse Daten doppelt in der Tabelle vorhanden sind. So weit so gut. Jetzt kommt es aber vor, dass zB ein Datensatz keinen Wert fuer column4 enthaelt und null ist. In diesem Fall wird der datensatz angelegt, egal ob die verbleibende Wertkombination bereits exiistiert. Kann man das Problem irgendwie loesen, dass keine Duplikate erstellt werden, also nicht der Fall eintritt:

col1 col2 col3 [...] col8 col9
xxxx yyyy hfff
xxxx yyyy ohuy        <--- Duplikat, da xxxx yyyy bereits existiert

Gibt es hierfuer einen einfachen Lesungsweg?

PS: Der Tabellen Index besteht im vorliegenden Fall aus mehreren Spalten, nicht nur aus vier spalten wie oben angefuehrt.

  1. Hello,

    Dies sollte eigentlich verhindern, dass gewisse Daten doppelt in der Tabelle vorhanden sind. So weit so gut. Jetzt kommt es aber vor, dass zB ein Datensatz keinen Wert fuer column4 enthaelt und null ist. In diesem Fall wird der datensatz angelegt, egal ob die verbleibende Wertkombination bereits exiistiert. Kann man das Problem irgendwie loesen, dass keine Duplikate erstellt werden, also nicht der Fall eintritt:

    col1 col2 col3 [...] col8 col9
    xxxx yyyy hfff
    xxxx yyyy ohuy        <--- Duplikat, da xxxx yyyy bereits existiert

    Gibt es hierfuer einen einfachen Lesungsweg?

    Wenn Du in einzelnen Spalten keine Duplikate wünschst, musst Du auch die Zwangsbedingung für diese Spalten einzeln definieren und nicht für den Kombinationsschlüssel.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hi,

      Danke fuer die Antwort. Es geht nicht darum, dass einzelne Werte nicht doppelte sein koennen, sondern die Kombination von Werte fuer bestimmte Spalten soll nicht doppelt erstellt werden. Wenn jetzt aber fuer eine bestimmten Spalten keine Wert vorhanden ist, wird dieser Datensatz doppelt angelegt und gerade das soll vermieden werden. Also etwa kombination aus col1 col2 col8 col 9 soll unique sein. In folgenden Fall waere Datensatz 1 und 3,4 unique aber eben nicht datensatz 2.

      -. col1 col2 col3 ... col8 col9
      1. xxxx yyyy uuuu ...
      2. xxxx yyyy uuuu ...
      3. xxxx yyyy uuuu ... iiii oooo
      4. xxxx yyyy uuuu ... iiii kkkk

      Wie kann man es loesen, dass der 2. datensatz nicht eingelesen?

      Gruss, Philip

      Hello,

      Dies sollte eigentlich verhindern, dass gewisse Daten doppelt in der Tabelle vorhanden sind. So weit so gut. Jetzt kommt es aber vor, dass zB ein Datensatz keinen Wert fuer column4 enthaelt und null ist. In diesem Fall wird der datensatz angelegt, egal ob die verbleibende Wertkombination bereits exiistiert. Kann man das Problem irgendwie loesen, dass keine Duplikate erstellt werden, also nicht der Fall eintritt:

      col1 col2 col3 [...] col8 col9
      xxxx yyyy hfff
      xxxx yyyy ohuy        <--- Duplikat, da xxxx yyyy bereits existiert

      Gibt es hierfuer einen einfachen Lesungsweg?

      Wenn Du in einzelnen Spalten keine Duplikate wünschst, musst Du auch die Zwangsbedingung für diese Spalten einzeln definieren und nicht für den Kombinationsschlüssel.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      1. Hi!

        Bitte zitiere nicht im TOFU-Stil sondern nur das, worauf du dich konkret beziehst. Danke.

        -. col1 col2 col3 ... col8 col9

        1. xxxx yyyy uuuu ...
        2. xxxx yyyy uuuu ...
          Wie kann man es loesen, dass der 2. datensatz nicht eingelesen?

        Indem du keine NULL-Werte zulässt. Wann immer NULL im Spiel ist, kommt NULL raus. Und da NULL ungleich NULL ist, sind der erste und der zweite Datensatz nicht gleich. Zwei Leerstrings hingegen wären gleich.

        Lo!

        1. moin,

          Und da NULL ungleich NULL ist, sind der erste und der zweite Datensatz nicht gleich. Zwei Leerstrings hingegen wären gleich.

          das ist meines wissen abhängig von dem jeweiligen dbms, zum beispiel läßt oracle mehrere NULL werte auf einen unique spalte zu, mssql hingegen nur einen NULL wert, ein zweiter würde abgelehnt werden.

          Ilja

          1. Hi!

            Und da NULL ungleich NULL ist, sind der erste und der zweite Datensatz nicht gleich. Zwei Leerstrings hingegen wären gleich.
            das ist meines wissen abhängig von dem jeweiligen dbms, zum beispiel läßt oracle mehrere NULL werte auf einen unique spalte zu, mssql hingegen nur einen NULL wert, ein zweiter würde abgelehnt werden.

            Nach Recherche sieht der Fall wohl so aus, dass sich MSSQL in dem Fall nicht an den Standard hält. Aber mit SET ANSI_NULLS ON kann man das auch da erreichen.

            Lo!

            1. moin,

              Hi!

              Und da NULL ungleich NULL ist, sind der erste und der zweite Datensatz nicht gleich. Zwei Leerstrings hingegen wären gleich.
              das ist meines wissen abhängig von dem jeweiligen dbms, zum beispiel läßt oracle mehrere NULL werte auf einen unique spalte zu, mssql hingegen nur einen NULL wert, ein zweiter würde abgelehnt werden.

              Nach Recherche sieht der Fall wohl so aus, dass sich MSSQL in dem Fall nicht an den Standard hält. Aber mit SET ANSI_NULLS ON kann man das auch da erreichen.

              es gibt noch andere möglichkeiten, dieses verhalten zum umgehen, zum beispiel den INDEX für NULL werte nicht anzuwenden, dann muss man es nicht grundsätzlich umstellen. wie auch immer, ich kenne das dbms SqlLite leider nicht und weiß nicht, wie es sich verhält. aber man muss eben berücksichtigen, dass sich bestimmte dbms bezüglich NULL werten anders verhalen und das eventuell auch so gewünscht ist.

              Ilja