source

표현식을 사용한 Oracle 고유 제약 조건

nicesource 2023. 10. 21. 10:30
반응형

표현식을 사용한 Oracle 고유 제약 조건

한다Oracle그러한 표현으로 제약 조건을 지원할 수 있습니까?

알림 Z = 'N'

ALTER TABLE A ADD CONSTRAINT U_A_KEY UNIQUE(X,Y,Z = 'N');

이것은Unique constraint가능할까요?

예:

INSERT INTO A VALUES('X','Y','N');  --OK
INSERT INTO A VALUES('X','Y','Y');  --OK
INSERT INTO A VALUES('X','Y','Y');  --OK
INSERT INTO A VALUES('X','Y','N');  --VOLIATION

어쩌면 이것이 우리가 생각해낼 수 있을지도

drop table tq84_n;

create table tq84_n (
   x number, 
   y number, 
   z varchar2(10)
);

create unique index tq84_n_x on tq84_n (
  case when z = 'N' then x || '-' || y 
       else null
  end
);

나중에:

insert into tq84_n values (4,5, 'N');

insert into tq84_n values (9,6, 'Y');
insert into tq84_n values (9,6, 'Y');

insert into tq84_n values (4,5, 'Y');

insert into tq84_n values (4,5, 'N');

마지막 던지기:

ORA-00001: unique constraint (SPEZMDBA.TQ84_N_X) violated

이 경우 가장 간단한 방법은 일반적으로 함수 기반 인덱스를 만드는 것입니다.뭐 이런 거.

CREATE UNIQUE INDEX u_a_key
    ON a( (CASE WHEN z = 'N' THEN x ELSE null END),
          (CASE WHEN z = 'N' THEN y ELSE null END) );

z가 'N'이 아닌 경우 두 CASE 문 모두 NULL로 평가되며 Oracle은 x & y 값을 인덱스 구조에 저장할 필요가 없습니다(인덱스가 더 작음).z가 'N'이면 x & y 값이 모두 인덱스에 저장되며 인덱스는 다른 복합 인덱스와 마찬가지로 동작합니다.

그 상황에서 제가 하는 일은 예를 들어 열을 만드는 것입니다.Z당신의 경우, 다음과 같은 것이 있습니다.

  • 특정 값(예: "N")이 고유해야 할 경우
  • null이 아니면 알 수 없음을 의미합니다. 알 수 없는 두 값은 서로 같지 않은 것으로 간주됩니다.

그런 다음 고유한 제약 조건을 생성할 수 있습니다.UNIQUE(X,Y,Z).

X와 Y가 같은 두 행과 Z="N"을 추가하면 오류가 발생합니다. X와 Y가 같은 두 행을 Z=null와 함께 추가하면 오류가 발생합니다.

언급URL : https://stackoverflow.com/questions/4648371/oracle-unique-constraint-with-expression

반응형