2016-02-24 4 views
0

Это схема для таблицы, здесь определено уникальное ограничение с 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; 

Если одно поле пуст, то единственное ограничение здесь не работает.

enter image description here

Как добавить ограничение так, чтобы один пустое значение принимается, так что это будет уникальным.

Может обрабатывать этот сценарий в приложении с использованием JPA?

ответ

4

Согласно documentation:

Нулевые значения не считаются равными

Так уникальное ограничение не будет работать таким образом. У вас есть 2 варианта:

  1. Создать триггер, который будет вручную проверить целостность данных и отклонить изменения, если таблица содержит более одного пустого значения.

  2. Установить значение по умолчанию на 0 и NOT NULL ограничение на эти столбцы. В этом случае вы сможете иметь только одну строку, содержащую пустое (ноль) значение.


Update:

Как Abelisto предположил, что можно легко сделать с functional indexes.

CREATE UNIQUE INDEX uix_job_test_sex_screening on job_profile(coalesce(job_category_id, -1), screening_type_id, test_id, sex); 
+0

Я думаю положить фиктивное значение как '0' не будет работать, пока не будет соответствующий job_category для этого значения –

+1

@ user630209 3. Создать уникальный функциональный индекс вместо ограничения, как 'CREATE UNIQUE INDEX uix_job_test_sex_screening на job_profile (coalesce (job_category_id, -1), screening_type_id, test_id, sex); ' – Abelisto

+0

@Abelisto - это идеальное решение. Раньше я никогда не использовал функциональные индексы. – AlexM

Смежные вопросы