Daten einfügen, keine Duplikate

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

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
http://www.snowflake-sl.info/index.html
Benutzeravatar
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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo ete!

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$
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Defnull hat geschrieben:Primärschlüssel sind immer unique.
Natürlich! Ich meinte eine Spalte/Index.

@Gerold

Vielen Dank! Deine Antwort ist, wie immer, sehr lehrreich :!: :)

Liebe Grüsse
http://www.snowflake-sl.info/index.html
Antworten