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