PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres-Einschränkung, die sicherstellt, dass eine Spalte von vielen vorhanden ist?

Aktualisierung vom 17.09.2021 :Ab heute bietet gerardnll eine bessere Antwort (die beste IMO) :

Um den Leuten zu helfen, die sauberste Lösung zu finden, empfehle ich Ihnen, gerardnlls Antwort zu unterstützen .

(FYI, ich bin dieselbe Person, die die ursprüngliche Frage gestellt hat.)

Hier ist meine ursprüngliche Antwort von 2013

Hier ist eine elegante zweispaltige Lösung gemäß der "constraint -- one oder die andere Spalte ist nicht null" PostgreSQL Message Board :

ALTER TABLE my_table ADD CONSTRAINT my_constraint CHECK (
  (column_1 IS NULL) != (column_2 IS NULL));

(Der obige Ansatz ist jedoch nicht auf drei oder mehr Spalten verallgemeinerbar.)

Wenn Sie drei oder mehr Spalten haben, können Sie den Wahrheitstabellenansatz verwenden, der durch a_horse_with_no_name veranschaulicht wird . Ich halte jedoch Folgendes für einfacher zu warten, da Sie die logischen Kombinationen nicht abtippen müssen:

ALTER TABLE my_table
ADD CONSTRAINT my_constraint CHECK (
  (CASE WHEN column_1 IS NULL THEN 0 ELSE 1 END) +
  (CASE WHEN column_2 IS NULL THEN 0 ELSE 1 END) +
  (CASE WHEN column_3 IS NULL THEN 0 ELSE 1 END) = 1;

Um dies zu komprimieren, wäre es nützlich, eine benutzerdefinierte Funktion zu erstellen, sodass CASE WHEN column_k IS NULL THEN 0 ELSE 1 END Boilerplate könnte entfernt werden, so dass etwas wie folgt bleibt:

(non_null_count(column_1) +
non_null_count(column_2) +
non_null_count(column_3)) = 1

Das kann so kompakt sein, wie es PSQL zulässt (?). Das heißt, ich würde es vorziehen, wenn möglich zu dieser Art von Syntax zu gelangen:

non_null_count(column_1, column_2, column_3) = 1