Wie kann ich eine Datenbanktabelle einschränken, damit nur eine Zeile in einer Spalte einen bestimmten Wert haben kann?

StackOverflow https://stackoverflow.com/questions/182262

  •  05-07-2019
  •  | 
  •  

Frage

Wenn Sie Oracle verwenden, kann ein Spaltenwert "Ja" oder "Nein" sein kann, ist es möglich, eine Tabelle einzuschränken, damit nur eine Zeile einen "Ja" -Wert haben kann?

Ich würde die Tabellenstruktur lieber neu gestalten, aber das ist nicht möglich.

Udpate] Leider sind in dieser Tabelle Nullwerte nicht zulässig.

War es hilfreich?

Lösung

Verwenden Sie einen funktionsbasierten Index:

create unique index only_one_yes on mytable
(case when col='YES' then 'YES' end);

Oracle indiziert nur Schlüssel, die nicht vollständig null sind, und der Fallausdruck hier stellt sicher, dass alle "Nein" -Werte in Nulls geändert und daher nicht indiziert werden.

Andere Tipps

Dies ist ein kludgy Hack, aber wenn die Spalte Nulls zulässt, können Sie Null anstelle von "Nein" verwenden und "Ja" genau wie zuvor verwenden. Wenden Sie eine eindeutige Schlüsselbeschränkung auf diese Spalte an, und Sie erhalten nie zwei "Ja" -Werte, haben aber immer noch viele NOs.

UPDATE: @Nick Pierpoint: Vorgeschlagenes Hinzufügen einer Überprüfungsbeschränkung, damit die Spaltenwerte nur auf "Ja" und Null beschränkt sind. Die Syntax ist in seiner Antwort geklappt.

Sie möchten einen Artikel von Tom Kyte überprüfen, wobei genau diese Frage gestellt wird und seine Antwort:

http://tkyte.blogspot.com/2008/05/anotherof-day.html

Zusammenfassung: Verwenden Sie keine Trigger, verwenden Sie keine autonomen Transaktionen und verwenden Sie zwei Tabellen.

Wenn Sie eine Oracle -Datenbank verwenden, müssen Sie es wissen Asktom Und holen Sie sich seine Bücher.

Es funktioniert nicht auf der Tischdefinition.

Wenn Sie die Tabelle jedoch mit einem Auslöser aktualisieren, das eine gespeicherte Prozedur aufruft, können Sie sicherstellen, dass nur eine Zeile "Ja" enthält.

  1. Stellen Sie alle Zeilen auf "Nein" ein
  2. Stellen Sie die Zeile ein, die Sie mit Ja möchten

Nach meinem Kommentar zu einer früheren Antwort von Yukondude würde ich einen eindeutigen Index und eine Scheckbeschränkung hinzufügen:

create table mytest (
    yesorno varchar2(3 char)
);

create unique index uk_mytest_yesorno on mytest(yesorno);

alter table mytest add constraint ck_mytest_yesorno check (yesorno is null or yesorno = 'YES');

Unterstützt Oracle so etwas wie gefilterte Indizes (Letzte Woche habe ich gehört, dass zB MSSQL2008)? Vielleicht können Sie a definieren einzigartiger Schlüssel Dies gilt nur für Zeilen mit dem Wert "Ja" in Ihrer Spalte.

Ich denke, ich würde eine zweite Tabelle verwenden, um auf die entsprechende Zeile in Ihrer aktuellen Tabelle zu verweisen. Diese andere Tabelle könnte verwendet werden, um auch Werte anderer Variablen zu speichern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top