Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Nur einmal wahr

Dieses Thema im Forum "Microsoft Access" wurde erstellt von Patrik74, 2 Juni 2020.

  1. Patrik74

    Patrik74 Neuer Benutzer

    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: 2 Juni 2020
  2. akretschmer

    akretschmer Datenbank-Guru

    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...
     
  3. Patrik74

    Patrik74 Neuer Benutzer

    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?
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  5. Patrik74

    Patrik74 Neuer Benutzer

    Ok, verstanden. Vielen Dank.

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

    akretschmer Datenbank-Guru

    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 ;-)
     
  7. Patrik74

    Patrik74 Neuer Benutzer

    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.
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Tja, an die vielen Features von PostgreSQL kommt kein anderes System so leicht ran ...
     
    Kampfgummibaerlie gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden