Nur einmal wahr

Patrik74

Neuer Benutzer
Beiträge
4
Ist es möglich eine Gültigkeitsregel so zu schreiben, dass sie sicherstellt, dass innerhalb einer Menge 1:n-verknüpfter Datensätze nur einmal der Wert Wahr gesetzt werden kann?

Beispiel: 1 Person kann n Adressen haben, aber nur einer davon ist der aktuelle Wohnort.

Ich würde also gerne in der Tabelle "Adressen" einen Marker ("Aktuell") setzen, der für genau einen Datensatz pro Person auf Wahr steht, aber für alle anderen falsch ist.

Ich würde das gerne unabhängig von Formularen und Steuerelementen lösen, daher am liebsten mit einer Gültigkeitsprüfung. Aber jede andere "tabellenbasierte" Lösung wäre mir auch recht.

Hat jemand eine Idee?
 
Zuletzt bearbeitet:
Werbung:
Code:
test=*# create table adresse (person int, adresse text, valid bool default false);
CREATE TABLE
test=*# create unique index idx_adresse on adresse (person) where (valid);
CREATE INDEX
test=*#
test=*#
test=*#
test=*# insert into adresse values (1, 'adresse 1', false);
INSERT 0 1
test=*# insert into adresse values (1, 'adresse 2', false);
INSERT 0 1
test=*# insert into adresse values (1, 'adresse 3', false);
INSERT 0 1
test=*# insert into adresse values (1, 'adresse 4', true);
INSERT 0 1
test=*# insert into adresse values (1, 'adresse 5', true);
FEHLER:  doppelter Schlüsselwert verletzt Unique-Constraint »idx_adresse«
DETAIL:  Schlüssel »(person)=(1)« existiert bereits.
test=*#

ist aber PostgreSQL, ob das deine DB kann weiß ich nicht...
 
Vielen Dank für die Antwort. Ich arbeite mit Access. Ich vermute PostGreSQL funktioniert da nicht.

Aber wenn ich es richtig interpretiere, dann erstellst du einen kombinierten Index über Person und Valid.

Daran hatte ich auch schon gedacht, aber ist es dann nicht so, dass die Person nur genau einmal mit Wahr und einmal mit falsch auftauchen kann?

Offensichtlich nicht, wie dein Beispiel zeigt, aber warum kann man so mehrfach die Person mit falsch eingeben, es ist doch ein unique index?
 
dann erstellst du einen kombinierten Index über Person und Valid.

Nein.

Code:
create unique index idx_adresse on adresse (person) where (valid);

Zum nachmalen: das ist ein Unique-Index auf 'person'. Die darf also nur einmalig vorkommen. Allerdings hat dieser Index noch eine WHERE-Condition, nämlich in der Spalte 'valid' muß TRUE stehen. Damit ist der Index also nur auf diese Rows begrenzt, alle anderen Rows, wo 'valid' eben NICHT true ist, werden von diesem unique index ignoriert.
 
Ok, verstanden. Vielen Dank.

Und lässt sich dieser Index ebenso elegant erweitern, so dass immer genau eine Adresse wahr sein muss?
 
Und lässt sich dieser Index ebenso elegant erweitern, so dass immer genau eine Adresse wahr sein muss?

Mhh, nicht wirklich. Nicht über einen Index, aber man könnte einen TRIGGER schreiben, der das (am Ende einer Transaktion, also deferred) prüft. Wäre jetzt so meine Idee.
Falls jemand eine bessere hat: nur her damit ;-)
 
Kurze Rückmeldung:

Ich habe den Eindruck, dass man in Access keinen Index mit Bedingung wie

Code:
create unique index idx_adresse on adresse (person) where (valid);

erstellen kann.

Man kann anscheinend nur zusammengesetzte Indizes erstellen. Daher funktioniert diese Lösung leider nicht. Falls es doch irgendwie funktioniert, wäre das natürlich super.
 
Werbung:
Zurück
Oben