Unique Index fuer eine Tabelle
Philip K.
- datenbank
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.
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 existiertGibt 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
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 existiertGibt 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
Hi!
Bitte zitiere nicht im TOFU-Stil sondern nur das, worauf du dich konkret beziehst. Danke.
-. col1 col2 col3 ... col8 col9
- xxxx yyyy uuuu ...
- 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!
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
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!
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