본문 바로가기

오라클/제약조건

제약조건 PRIMARY KEY 기본키

-- 기본키 PRIMARY KEY

  테이블의 유일성을 보장하기 위한 제약조건

  하나의 테이블에는 하나의 기본키만 가질 수 있다.


 방법1. 컬럼레벨로 기본키 지정

    -- 하나의 컬럼을 이용하여 간단하게 기본키를 지정한다.

    CREATE TABLE 테이블명(

      컬럼명 타입 [CONSTRAINT 제약조건이름]  PRIMARY KEY

        :

    );

    

 방법2. 테이블레벨로 기본키지정(이건 기억해놔야한다)

    -- 하나이상의 컬럼을 이용하여 기본키를 지정 할 수 있다.

    CREATE TABLE 테이블명(

     컬럼명 타입

            :

      , CONSTRAINT 제약조건이름 PRIMARY KEY (컬럼명,[컬럼명]))

    );


  --제약조건 이름은 제약조건을 삭제하거나 변경할 때 이용된다.

  --제약조건 이름은 다른 제약조건, 개체와도 중복 될 수 없다.


===================================================================================================

제약조건에 이름을 붙이는 이유 :

컬럼의 제약조건에 따라서 데이터를 입력할 수 있는 조건이 달라진다.

이에 따라서 어떤 컬럼이 어떤 제약조건인지 확인해야한다.

그런데 제약조건이름을 붙이지 않고서는 어떤 제약조건이 붙어있는지 확인할 수 없기 때문이다.


바로 아래에 제약조건 확인하는 쿼리가 있다.

이름을 붙이지 않으면 오라클이 임의의 이름을 붙이는데 이것으로는 어떤제약조건인지 알 수가 없다.

--제약조건 확인( 제약조건은 보이지만 어떤 칼럼인지는 모른다)

SELECT * FROM USER_CONSTRAINTS;

SELECT * FROM USER_CONSTRAINTS WHERE table_name='TEST1(테이블이름)';

(테이블이름은 대문자여야한다.)

-- 여기서 constrain_type 컬럼의 알파벳에 따라 어떤 제약조건인지 알 수 있다.

      -- P: 기본키, U:UNIQUE, R:참조키, C:NOT NULL 등

  

--제약조건이 어떤 칼럼에 있는지 확인(어떤 제약조건인지는 확인 불가능)

SELECT * FROM USER_CONS_COLUMNS;

===================================================================================================


    --방법1 ex)
  CREATE TABLE test2(
  num NUMBER CONSTRAINT pk_test2_num primary key
  ,name VARCHAR2(20) NOT NULL
  ,birth DATE
);

SELECT * FROM USER_CONSTRAINTS WHERE table_name='TEST2';

    --방법2 ex)
CREATE TABLE test3(
  num NUMBER
  ,name VARCHAR2(20) NOT NULL
  ,birth DATE
  , CONSTRAINT pk_test3_num primary key(num)
);

-- 두 개의 컬럼으로 하나의 기본키 저장하는 예

CREATE TABLE test4(

  hak NUMBER

  ,num NUMBER

  ,name VARCHAR2(20) NOT NULL

  ,birth DATE

  , CONSTRAINT pk_test4_num primary key(hak,num)

);


SELECT * FROM USER_CONSTRAINTS WHERE table_name='TEST4';

SELECT * FROM USER_CONS_COLUMNS WHERE table_name='TEST4';


INSERT INTO test4(hak, num, name) VALUES (1,1,'aaa');    -- 데이타를 입력함

INSERT INTO test4(hak, num, name) VALUES (1,2,'bbb');

INSERT INTO test4(hak, num, name) VALUES (2,1,'ccc');

INSERT INTO test4(hak, num, name) VALUES (2,2,'ddd');

COMMIT;

=> hak,num으로 하나의 기본키를 만들었다. 따라서 2개의 컬럼의 데이타가 똑같을때 무결성 오류로 입력불가능.

hakt,num의 데이타 중 하나만 다르다면 입력이 가능한 것이다.


INSERT INTO test4(hak, num, name) VALUES (1,2,'aaa'); --에러 : 기본키 제약 오류(중복허용안됨)

SELECT * FROM test4;


INSERT INO test4(hak, num, name) VALUES (5,null,'eee'); -- 에러 : 기본키는 null이 될 수 없다.

  -- 기본키는 not null이 없어도 not null, 꼭 데이타를 입력해야만 한다



----------------------------------------------------------------------------

  --존재하는 테이블에 기본키 부여

  ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건이름 PRIMARY KEY (컬럼 [,컬럼]);

  

  ALTER TABLE test4 ADD CONSTRAINT pk_test4_num PRIMARY KEY( hak,num);

      --오류 : 기본키 제약 조건에 위배되는 자료가 있으므로 불가능(데이타가 이미있기 때문에 오류가 생기는 것이 아니다)


  DELETE FROM test4 WHERE hak=5; --위배되는 자료 삭제

  COMMIT;

  ALTER TABLE test4 ADD CONSTRAINT pk_test4_num PRIMARY KEY( hak,num);

  SELECT * FROM USER_CONSTRAINTS WHERE table_name='TEST4';

  --프리머리 키가 생겨있다.

  

  ---------------------------------------------------------------------------  

  --기본키 제거

  ALTER TABLE 테이블명 DROP PRIMARY KEY;

  ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건이름; -- 다른 제약조건도 삭제가능

  

  ALTER TABLE test4 DROP PRIMARY KEY;

  SELECT * FROM USER_CONSTRAINTS WHERE table_name='TEST4';

  -- CONSTRAINT_TYPE이 P에서 C로 바뀌었음

  

  INSERT INTO test4(hak,num,name) values(5,null,'eee');

  --null이 기본키가 아니므로 가능


  

  ----------------------------------------------------------------------------



'오라클 > 제약조건' 카테고리의 다른 글

참조키(외래키, FORIGN KEY)  (0) 2013.06.11
제약조건 DEFAULT 디폴트  (0) 2013.06.01
제약조건 NOT NULL  (0) 2013.06.01
제약조건 CHECK  (0) 2013.06.01
제약조건 UNIQUE 유니크  (0) 2013.06.01