Seite 1 von 1
Dubletten vermeiden in sqlite
Verfasst: Montag 25. Februar 2013, 23:09
von Trubinial Guru
Hallo, ich habe eine kleine Tabelle mit den Spalten
Primary Key, Key, Value, Changed. Ab und an wird versucht eine Reihe hinzuzufügen, wobei die Zeile nur dann hinzugefügt werden soll, wenn noch keine Reihe mit den selben
Key-Wert vorhanden ist. Somit sollen Dubletten vermieden werden. In der Spalte Value dürfen Einträge mehrfach vorkommen.
Ich hatte es so verstanden, dass ich der Zeile, in der kein Eintrag mehrfach auftauchen darf, ein
UNIQUE zuordne und dann immer über
INSERT OR IGNORE eine Reihe hinzufüge, wenn es noch keine Reihe mit dem selben Key-Wert gibt.
Die Tabelle habe ich also so erstellt:
Code: Alles auswählen
CREATE TABLE IF NOT EXISTS configTable (
id INTEGER PRIMARY KEY,
key TEXT UNIQUE,
value TEXT,
changed INTEGER
)
und die Reihe habe ich so hinzugefügt:
Code: Alles auswählen
INSERT OR IGNORE
INTO configTable (key, value, changed) VALUES (
?, ?, ?
)
Nur leider sorgt das nur dazu, dass die Reihe immer hinzugefügt wird - egal ob schon eine Reihe mit dem selben Key-Wert vorhanden ist. Liegt der Fehler woanders oder habe ich das einfach falsch verstanden?
Vielen Dank
Re: Dubletten vermeiden in sqlite
Verfasst: Dienstag 26. Februar 2013, 07:41
von noisefloor
Hallo,
wenn der "key" eindeutig ist (sein muss), dann mach' ihn zum "primary key". Das ist ja genau der Sinn eines primary keys
Gruß, noisefloor
Re: Dubletten vermeiden in sqlite
Verfasst: Dienstag 26. Februar 2013, 21:27
von Trubinial Guru
Macht nicht nur Sinn, sondern funktioniert sogar auch

Danke dir!
Nur interessehalber die Frage : wofür ist denn dann UNIQUE?
Re: Dubletten vermeiden in sqlite
Verfasst: Dienstag 26. Februar 2013, 21:55
von noisefloor
Hallo,
einen primary key darf es nur genau 1x geben, UNIQUE darf pro Tabelle beliebig oft vorkommen. Siehe auch z.B.
http://www.w3schools.com/sql/sql_unique.asp
Gruß, noisefloor
Re: Dubletten vermeiden in sqlite
Verfasst: Dienstag 26. Februar 2013, 23:25
von Sirius3
Hallo Trubinial Guru,
nur der Vollständigkeit halber. Bei mir tut UNIQUE was es soll:
Code: Alles auswählen
>>> db=sqlite3.Connection('test.db')
>>> cur=db.cursor()
>>> cur.execute('''CREATE TABLE IF NOT EXISTS configTable (
... id INTEGER PRIMARY KEY,
... key TEXT UNIQUE,
... value TEXT,
... changed INTEGER
... )''')
<sqlite3.Cursor object at 0x10ef335e0>
>>> cur.execute("insert into configTable values (null,'k','v',1)")
<sqlite3.Cursor object at 0x10ef335e0>
>>> cur.execute("insert into configTable values (null,'k','w',2)")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
sqlite3.IntegrityError: column key is not unique
Re: Dubletten vermeiden in sqlite
Verfasst: Dienstag 5. März 2013, 09:28
von Trubinial Guru
Hallo, ich habe gemerkt, dass ich doch noch ein anderes Szenario beachten muss. Undzwar darf ein "key" in Kombination mit dem Wert der neuen Spalte "userID" nicht mehrfach vorkommen.
Beispiel:
Folgendes ist erlaubt:
Key userID
--------------------------
A _____ 1
A _____ 2
B _____ 1
Folgendes darf nicht passieren:
Key userID
--------------------------
A _____ 1
A _____ 1
B _____ 1
Gibt es da einen einfachen Weg, dass zu lösen oder muss ich mir da was passendes selber schreiben?
Re: Dubletten vermeiden in sqlite
Verfasst: Dienstag 5. März 2013, 11:26
von EyDu
Ich weiß nicht, ob SQLite es unterstzützt, aber prinzipiell sollte es so gehen:
Code: Alles auswählen
CREATE TABLE eggs(
spam INTEGER,
ham INTEGER,
value INTEGER,
UNIQUE KEY(spam, ham));
Re: Dubletten vermeiden in sqlite
Verfasst: Dienstag 5. März 2013, 21:31
von Trubinial Guru
So scheint es leider nicht zu funktionieren (OperationalError). Auch würde doch das erste Beispiel dann nicht gehen ... :K
Re: Dubletten vermeiden in sqlite
Verfasst: Mittwoch 6. März 2013, 19:40
von noisefloor
Hallo,
musst du eigentlich SQLite nehmen?
Diese Arten von Daten ließe sich sehr elegant mit Redis speichern, wenn du als Datentyp ein Set nimmst.
Gruß, noisefloor
Re: Dubletten vermeiden in sqlite
Verfasst: Mittwoch 6. März 2013, 20:13
von Trubinial Guru
Ja, ich bin leider auf SQLite angewiesen - notfalls muss ich das Problem wohl irgendwie umgehen ...
Trotzdem danke euch
Re: Dubletten vermeiden in sqlite
Verfasst: Mittwoch 6. März 2013, 20:50
von EyDu
Dann übernehme ich
das mal. Was genau sind denn jetzt deine Anforderungen? Für mich sieht es so aus, als wenn das Tuple (key, userID) eindeutig sein muss.