Datenbankeintrag bedingt erstellen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Aries
User
Beiträge: 51
Registriert: Mittwoch 21. August 2013, 01:19

Hallo, ich möchte einen sqlite3-Datenbanktabelleneintrag unter der Bedingung erstellen, dass ein gleicher Eintrag noch nicht existiert. Wie geht das?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wie ist denn ein "gleicher" Datensatz definiert? Ohne dieses Wissen kann man dazu schlecht etwas konkretes sagen...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Aries
User
Beiträge: 51
Registriert: Mittwoch 21. August 2013, 01:19

Hyperion hat geschrieben:Wie ist denn ein "gleicher" Datensatz definiert? Ohne dieses Wissen kann man dazu schlecht etwas konkretes sagen...
Wenn alle Werte gleich sind, ist er gleich. Entscheidend ist in meinem Fall allerdings eine einzelne Spalte. Wenn also bereits ein Eintrag mit dem in diese Spalte einzutragende Wert besteht, soll kein neuer Eintrag erstellt werden.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Aries hat geschrieben:Entscheidend ist in meinem Fall allerdings eine einzelne Spalte. Wenn also bereits ein Eintrag mit dem in diese Spalte einzutragende Wert besteht, soll kein neuer Eintrag erstellt werden.
Ich würde ja einfach die Spalte UNIQUE definieren und auf einen entsprechenden zurückgemeldeten Fehler des Datenbanksystems passend reagieren.
BlackJack

Falls das mit dem UNIQUE nicht funtkionieren sollte, muss man halt einfach prüfen ob es so einen Eintrag bereits gibt.
Aries
User
Beiträge: 51
Registriert: Mittwoch 21. August 2013, 01:19

/me hat geschrieben:
Aries hat geschrieben:Entscheidend ist in meinem Fall allerdings eine einzelne Spalte. Wenn also bereits ein Eintrag mit dem in diese Spalte einzutragende Wert besteht, soll kein neuer Eintrag erstellt werden.
Ich würde ja einfach die Spalte UNIQUE definieren und auf einen entsprechenden zurückgemeldeten Fehler des Datenbanksystems passend reagieren.
Danke, das funktioniert.
Aries
User
Beiträge: 51
Registriert: Mittwoch 21. August 2013, 01:19

Aries hat geschrieben:
Hyperion hat geschrieben:Wie ist denn ein "gleicher" Datensatz definiert? Ohne dieses Wissen kann man dazu schlecht etwas konkretes sagen...
Wenn alle Werte gleich sind, ist er gleich. Entscheidend ist in meinem Fall allerdings eine einzelne Spalte. Wenn also bereits ein Eintrag mit dem in diese Spalte einzutragende Wert besteht, soll kein neuer Eintrag erstellt werden.
Ich habe jetzt ein leicht anderes Problem: Jetzt kommt es nicht mehr nur auf eine einzelne Spalte an. Stattdessen soll ein Eintrag nur dann verhindert werden, wenn ein in allen Spalten gleicher Eintrag bereits existiert. Wie kann man das erreichen?

Beispiel:

Wenn der Eintrag "(1 , a)" schon existiert, sollen die Einträge "(1 , b)" und "(2 , a)" erlaubt sein, der Eintrag "(1 , a)" aber verboten sein
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Aries hat geschrieben:Ich habe jetzt ein leicht anderes Problem: Jetzt kommt es nicht mehr nur auf eine einzelne Spalte an. Stattdessen soll ein Eintrag nur dann verhindert werden, wenn ein in allen Spalten gleicher Eintrag bereits existiert. Wie kann man das erreichen?
Das kann man dadurch erreichen, dass man alle Spalten gemeinsam als Unique definiert.

Mich würde ja der Use-Case dahinter interessieren.
Aries
User
Beiträge: 51
Registriert: Mittwoch 21. August 2013, 01:19

/me hat geschrieben:
Aries hat geschrieben:Ich habe jetzt ein leicht anderes Problem: Jetzt kommt es nicht mehr nur auf eine einzelne Spalte an. Stattdessen soll ein Eintrag nur dann verhindert werden, wenn ein in allen Spalten gleicher Eintrag bereits existiert. Wie kann man das erreichen?
Das kann man dadurch erreichen, dass man alle Spalten gemeinsam als Unique definiert.
Wenn ich folgende Seite (http://www.sqlite.org/lang_createtable.html) richtig verstehe müsste das dann so aussehen:

create table Beispieltabelle (Spalte1 integer, Spalte2 text, unique (1,2) "conflict clause")

Ich sehe auf der Seite jedoch nicht, was bei "conflict clause" hin muss.
BlackJack

@Aries: Dazu müsstest Du dem Link folgen der vor dem Syntaxdiagramm steht, also in diesem Fall `table-constraint`. Da kommt man dann auf die Seite auf der *alle* Syntaxdiagramme aufgelistet sind und da sind unter jedem auch Querverweise für die enthaltenen Verweise auf andere Syntaxdiagramme und auch wieder zurück zur Dokumentation. Bei http://www.sqlite.org/syntaxdiagrams.ht ... ict-clause sieht man, dass man die „conflict clause” auch leer sein darf. Und unter dem Diagramm ist ein Link zu http://www.sqlite.org/lang_conflict.html wo die verschiedenen Möglichkeiten erklärt werden.

Bei `indexed-column` kommt eigentlich der Name der Spalte hin und keine Nummer.

Eine Tabelle bei der alle Spalten zusammen ein Schlüsselkandidat sind, finde ich übrigens auch interessant.
Antworten