sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgres-begrænsning, der sikrer, at en kolonne af mange er til stede?

2021-09-17 opdatering :Fra i dag giver gerardnll et bedre svar (den bedste IMO) :

For at hjælpe folk med at finde den reneste løsning, anbefaler jeg, at du stemmer op til gerardnls svar .

(FYI, jeg er den samme person, som stillede det oprindelige spørgsmål.)

Her er mit originale svar fra 2013

Her er en elegant løsning med to kolonner i henhold til "begrænsningen -- en eller den anden kolonne ikke null" PostgreSQL opslagstavle :

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

(Men ovenstående tilgang kan ikke generaliseres til tre eller flere kolonner.)

Hvis du har tre eller flere kolonner, kan du bruge sandhedstabeltilgangen illustreret af a_hest_med_ingen_navn . Jeg anser dog følgende for at være lettere at vedligeholde, fordi du ikke behøver at indtaste de logiske kombinationer:

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;

For at komprimere dette ville det være nyttigt at oprette en brugerdefineret funktion, så CASE WHEN column_k IS NULL THEN 0 ELSE 1 END kedelplade kunne fjernes, hvilket efterlader noget som:

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

Det kan være så kompakt, som PSQL tillader (?). Når det er sagt, vil jeg foretrække at komme til denne form for syntaks, hvis det er muligt:

non_null_count(column_1, column_2, column_3) = 1


  1. Hvad er den bedste SQL Server-opsætning til et udviklingsmiljø?

  2. Deadlock ved hjælp af SELECT ... TIL OPDATERING i MySQL

  3. Tredjeparts Oracle-udbydere til .Net med objekttypeunderstøttelse

  4. MySQL understreng match ved hjælp af regulært udtryk; understreng indeholder 'mand' ikke 'kvinde'