Это не совсем понятно, что вы хотели бы достичь.
Если вам нужна только одна колонна NOT NULL
для каждой строки, то ответ Nitram будет делать, вы можете также попробовать:
CHECK ((sign(coalesce(field_1,0)) +
sign(coalesce(field_2,0)) + sign(coalesce(field_3,0))) <= 1)
В противном случае, если вам нужно иметь только одного NOT NULL
столбец на все строки с данным FK, вы должны посмотреть на CONSTRAINT TRIGGER
, что-то вроде этого:
CREATE OR REPLACE FUNCTION only_one() RETURNS trigger AS $only_one$
DECLARE
cnt int4;
BEGIN
SELECT sign(coalesce(field_1,0)) +
sign(coalesce(field_2,0)) +
sign(coalesce(field_3,0)) +
sign(coalesce(NEW.field_1,0)) +
sign(coalesce(NEW.field_2,0))+
sign(coalesce(NEW.field_3,0))
INTO cnt
FROM my_table WHERE fk = NEW.fk;
IF cnt > 1 THEN
RAISE EXCEPTION 'Sorry, too much NOT NULL values for FK=%', NEW.fk;
END IF;
RETURN NEW;
END;
$only_one$ LANGUAGE plpgsql;
CREATE CONSTRAINT TRIGGER my_table_only_one
AFTER INSERT OR UPDATE ON my_table
FOR EACH ROW EXECUTE PROCEDURE only_one();
Да, но это может быть не лучшая идея. –