Hallo!
Ich habe folgende DB:
Project Shot Image
HS01 01 01A_001.jpg
HS01 01 01A_009.jpg
HS01 02 02A_001.jpg
HS02 01 01A_043.jpg
HS02 09 09A_010.jpg
HS03 15 15B_033.jpg
Nun müssen ständig in die DB neue Daten geschrieben werden, wobei eine vollständige Reihe nicht nochmal vorkommen darf. Also z.B.
HS01 01 01A_001.jpg darf nicht nochmals eingefügt werden,
HS01 01 01A_002.jpg aber schon.
Jetzt habe ich mehrere Wege gelesen, dies zu vermeiden.
Welcher ist aber der sinnvollste?
1) Einen Primärschlüssel UNIQUE machen (z.B. HS01_01_01A_001.jpg)?
2) Über INSERT INTO IF NOT EXIST?
3) Über ALTER TABLE
4) ...
Wobei die Dateneingabe natürlich weiterlaufen soll, nachdem ein Duplikat gefunden wurde.
Was benutzt man in solchen Fällen am Besten? Ich bin etwas verwirrt, da es mehrere Möglichkeiten zu geben scheint.
Ich benutze sqlite.
Lg
Daten einfügen, keine Duplikate
http://www.snowflake-sl.info/index.html
- Defnull
- User
- Beiträge: 778
- Registriert: Donnerstag 18. Juni 2009, 22:09
- Wohnort: Göttingen
- Kontaktdaten:
Primärschlüssel sind immer unique.
Bottle: Micro Web Framework + Development Blog
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo ete!
mfg
Gerold
Code: Alles auswählen
#!/usr/bin/env python
# coding: utf-8
import sqlite3
def main():
conn = sqlite3.connect(":memory:")
# Tabelle erstellen
sql = """
CREATE TABLE data (
id INTEGER PRIMARY KEY NOT NULL,
project TEXT NOT NULL,
shot TEXT NOT NULL,
image TEXT NOT NULL
);
CREATE UNIQUE INDEX ix_data_unique ON data (project, shot, image);
"""
conn.executescript(sql)
conn.commit()
# Daten hinzufügen (siehe: http://sqlite.org/lang_insert.html)
sql = """
INSERT OR IGNORE INTO data (
project,
shot,
image
) VALUES (
?,
?,
?
);
"""
data = [
[u"HS01", u"01", u"01A_001.jpg"],
[u"HS01", u"01", u"01A_009.jpg"],
[u"HS01", u"02", u"02A_001.jpg"],
[u"HS02", u"01", u"01A_043.jpg"],
[u"HS02", u"09", u"09A_010.jpg"],
[u"HS03", u"15", u"15B_033.jpg"],
]
conn.executemany(sql, data)
conn.commit()
# Daten nochmal hinzufügen
data = [
[u"HS01", u"01", u"01A_001.jpg"],
[u"HS01", u"01", u"01A_002.jpg"],
[u"HS01", u"01", u"01A_003.jpg"],
]
conn.executemany(sql, data)
conn.commit()
# Daten abrufen
cur = conn.cursor()
sql = """
SELECT
id,
project,
shot,
image
FROM
data
ORDER BY
project,
shot,
image
;
"""
cur.execute(sql)
for row in cur:
print repr(row)
if __name__ == "__main__":
main()
Code: Alles auswählen
gerold@ubuntu:~/Desktop$ python hallo.py
(1, u'HS01', u'01', u'01A_001.jpg')
(7, u'HS01', u'01', u'01A_002.jpg')
(8, u'HS01', u'01', u'01A_003.jpg')
(2, u'HS01', u'01', u'01A_009.jpg')
(3, u'HS01', u'02', u'02A_001.jpg')
(4, u'HS02', u'01', u'01A_043.jpg')
(5, u'HS02', u'09', u'09A_010.jpg')
(6, u'HS03', u'15', u'15B_033.jpg')
gerold@ubuntu:~/Desktop$
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Natürlich! Ich meinte eine Spalte/Index.Defnull hat geschrieben:Primärschlüssel sind immer unique.
@Gerold
Vielen Dank! Deine Antwort ist, wie immer, sehr lehrreich
Liebe Grüsse
http://www.snowflake-sl.info/index.html