Oracle 메 인 키 및 제약 조건

Oracle 메 인 키 Primary Key 는 비 어 있 는 제약 조건 과 유일한 제약 조건 을 포함 합 니 다.
홈 키 추가 문
alter table table_name add constraint cons_name primary key(col_name);
홈 키 가 생 성 되 었 는 지 확인 합 니 다
select dbms_metadata.get_ddl('OBJECT_TYPE','NAME','SCHEMA') from dual;
OBJECT_TYPE (TABLE,PARTITION,INDEX......)
NAME (OBJECT_NAME)
SCHEMA (INSTANCE)
object 표 에 해당 하 는 내용:
select object_type,object_name,owner from dba_objects
 
가 져 온 DDL 문 구 는 CUSTTEL 에 있 는 홈 키 열 을 만 들 었 음 을 표시 합 니 다.
CREATE TABLE "NEWCCS"."USERLEVELBYTEL_BAK" 
   ( "CUSTTEL" VARCHAR2(20), 
 "USERLEVEL" NUMBER(*,0) NOT NULL ENABLE, 
 "CUSTID" VARCHAR2(20)
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "NEWCCS" ;
 
  ALTER TABLE "NEWCCS"."USERLEVELBYTEL_BAK" MODIFY ("USERLEVEL" NOT NULL ENABLE);

홈 키 를 만 든 후 이 표 에 유일한 색인 과 홈 키 필드 가 추가 되 었 습 니 다.
CREATE TABLE "NEWCCS"."USERLEVELBYTEL_BAK" 
   ( "CUSTTEL" VARCHAR2(20), 
 "USERLEVEL" NUMBER(*,0) NOT NULL ENABLE, 
 "CUSTID" VARCHAR2(20), 
  CONSTRAINT "PK_PRIMARY" PRIMARY KEY ("CUSTTEL")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "NEWCCS"  ENABLE
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "NEWCCS" ;
 
  CREATE UNIQUE INDEX "NEWCCS"."PK_PRIMARY" ON "NEWCCS"."USERLEVELBYTEL_BAK" ("CUSTTEL") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "NEWCCS" ;
 
  ALTER TABLE "NEWCCS"."USERLEVELBYTEL_BAK" ADD CONSTRAINT "PK_PRIMARY" PRIMARY KEY ("CUSTTEL")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "NEWCCS"  ENABLE;
 
  ALTER TABLE "NEWCCS"."USERLEVELBYTEL_BAK" MODIFY ("USERLEVEL" NOT NULL ENABLE);

 
인증:
테이블 에 데이터 insert 를 userlevelbytel values ('10010', '3', ') 에 반복 해서 삽입 합 니 다.
다음 오류 알림 이 나타 납 니 다 (유일한 제약 오류):
ORA-00001: unique constraint (NEWCCS.PK_PRIMARY) violated
userlevelbytel 값 에 빈 값 insert 삽입 (',' 3 ',');
다음 오류 알림 이 나타 납 니 다 (유일한 제약 오류):
ORA-01400: cannot insert NULL into ("NEWCCS"."USERLEVELBYTEL_BAK"."CUSTTEL")
 
유일한 구속 대비 차 이 를 단독으로 추가 합 니 다.
이 테이블 의 홈 키 삭제:
alter table userlevelbytel_bak drop constraint pk_primary;
CREATE TABLE "NEWCCS"."USERLEVELBYTEL_BAK" 

   ( "CUSTTEL" VARCHAR2(20), 

 "USERLEVEL" NUMBER(*,0) NOT NULL ENABLE, 

 "CUSTID" VARCHAR2(20), 

  CONSTRAINT "UNIQUE_CUSTTEL" UNIQUE ("CUSTTEL")

  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 

  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)

  TABLESPACE "NEWCCS"  ENABLE

   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING

  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)

  TABLESPACE "NEWCCS" ;

 

  CREATE UNIQUE INDEX "NEWCCS"."UNIQUE_CUSTTEL" ON "NEWCCS"."USERLEVELBYTEL_BAK" ("CUSTTEL") 

  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 

  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)

  TABLESPACE "NEWCCS" ;

 

  ALTER TABLE "NEWCCS"."USERLEVELBYTEL_BAK" MODIFY ("USERLEVEL" NOT NULL ENABLE);

 

  ALTER TABLE "NEWCCS"."USERLEVELBYTEL_BAK" ADD CONSTRAINT "UNIQUE_CUSTTEL" UNIQUE ("CUSTTEL")

  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 

  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)

  TABLESPACE "NEWCCS"  ENABLE;

유일한 제약 이 생 성 되 는 것 을 볼 수 있 습 니 다.
테스트:
비 어 있 는 기록 반복 삽입:
ORA-00001: unique constraint (NEWCCS.UNIQUE_CUSTTEL) violated
빈 기록 반복 삽입:
select * from userlevelbytel_bak where custtel is null;
검색 결 과 는 여러 개의 중 복 된 빈 기록 입 니 다.
 
이 를 통 해 알 수 있 듯 이 유일한 제약 은 비 어 있 는 값 만 제약 하고 Oracle 에서 NULL 값 은 비교 할 수 없 기 때문에 반복 적 으로 삽입 하 더 라 도 유일한 제약 은 제한 할 수 없 지만 조합 제약 조건 에서 예 를 들 어 (A, B, NULL) 는 비교 할 수 있다.
예:
alter table userlevelbytel_bak add constraint unique_custtel unique(custtel,userlevel);
빈 기록 반복 삽입:
ORA-00001: unique constraint (NEWCCS.UNIQUE_CUSTTEL) violated

좋은 웹페이지 즐겨찾기