Это схема для таблицы, здесь определено уникальное ограничение с job_category_id, screening_type_id, test_id, sex.Уникальный ключ с пустым значением
CREATE TABLE job_profile
(
profile_id numeric(5,0) NOT NULL,
job_category_id numeric(5,0),
test_id numeric(5,0),
sex character(1),
default_yn character(1),
screening_type_id numeric(5,0),
CONSTRAINT job_profile_pkey PRIMARY KEY (profile_id),
CONSTRAINT fk_jobprofile_jobcate FOREIGN KEY (job_category_id)
REFERENCES job_category_mast (job_category_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_jobprofile_test FOREIGN KEY (test_id)
REFERENCES test_mast (test_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_prof_screentype FOREIGN KEY (screening_type_id)
REFERENCES screening_type_mast (screening_type_id) MATCH SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT uk_job_test_sex_screening UNIQUE (job_category_id, screening_type_id, test_id, sex)
)
WITH (
OIDS=FALSE
);
ALTER TABLE job_profile
OWNER TO cdcis;
GRANT ALL ON TABLE job_profile TO cdcis;
GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE job_profile TO cdcis_app;
Если одно поле пуст, то единственное ограничение здесь не работает.
Как добавить ограничение так, чтобы один пустое значение принимается, так что это будет уникальным.
Может обрабатывать этот сценарий в приложении с использованием JPA?
Я думаю положить фиктивное значение как '0' не будет работать, пока не будет соответствующий job_category для этого значения –
@ user630209 3. Создать уникальный функциональный индекс вместо ограничения, как 'CREATE UNIQUE INDEX uix_job_test_sex_screening на job_profile (coalesce (job_category_id, -1), screening_type_id, test_id, sex); ' – Abelisto
@Abelisto - это идеальное решение. Раньше я никогда не использовал функциональные индексы. – AlexM