어제 두 개의 컬럼으로 기본키를 부여한 것으로 실습을 해보자.

-- 두 개의 컬럼으로 기본키 부여
CREATE TABLE test5 (
    id VARCHAR2(30),
    code NUMBER,
    pwd VARCHAR2(30) NOT NULL,
    name VARCHAR2(30) NOT NULL,
    birth DATE,
    CONSTRAINT pk_test5_id PRIMARY KEY( id, code )
    -- 복합키로 기본키를 구성할 때는 꼭 테이블 레벨로 작성해야함
);
SELECT * FROM USER_CONSTRAINTS WHERE table_name= 'TEST5';
SELECT * FROM USER_CONS_COLUMNS WHERE table_name= 'TEST5';

INSERT INTO test5(id, code, pwd, name) VALUES('a', 1, '1', '1');
SELECT* FROM test5;

INSERT INTO test5(id, code, pwd, name) VALUES('a', 1, '2', '2');
    -- 에러 : ORA-00001 기본키 제약 위반
INSERT INTO test5(id, code, pwd, name) VALUES('a', 2, '2', '2');
SELECT* FROM test5;

INSERT INTO test5(id, code, pwd, name) VALUES('b', NULL, '3', '3');
    -- 에러 : ORA-01400 기본키는 NULL이 될 수 없다.
    -- 기본키는 NOT NULL을 안줘도 NOT NULL

UPDATE test5 set code = 3 WHERE id = 'a' AND code = 2; 
-- 이럴때 95퍼 이상 WHERE은 기본키로 준다.
-- 제약 조건을 위반하지 않으면 기본키 수정 가능
SELECT* FROM test5;

 


기본키가 없는 테이블을 생성해서 생성된 테이블에 기본키를 추가해보자.

CREATE TABLE test6 (
    id VARCHAR2(30),
    pwd VARCHAR2(30) NOT NULL,
    name VARCHAR2(30) NOT NULL
);
SELECT * FROM tab;

INSERT INTO test6(id, pwd, name) VALUES ('1', '1', '1');
INSERT INTO test6(id, pwd, name) VALUES ('1', '2', '2');
SELECT * FROM test6;

SELECT * FROM USER_CONSTRAINTS WHERE table_name= 'TEST6';
SELECT * FROM USER_CONS_COLUMNS WHERE table_name= 'TEST6';
-- 기본키가 없음을 확인할 수 있다.

테이블 생성 및 자료 추가

존재하는 테이블에 기본키 추가

ALTER TABLE test6 ADD CONSTRAINT pk_test6_id PRIMARY KEY ( id );
    -- 에러 : ORA-02437. 기본키 위반의 데이터가 존재하므로 추가할 수 없다.

ID를 기본키로 하려고 했으나 이미 들어가 있는 테이블에 ID가 중복적인 것이 존재하므로 기본키 제약조건 위반으로 설정할 수 없다. 따라서 테이블 생성 -> 기본키 추가 -> 테이블에 자료 추가 로 해야함.

 

여기서는 테이블 생성 -> 테이블에 자료 추가 를 먼저 했기 때문에 자료를 다 삭제하고 기본키를 주어야한다.

-- 모든 데이터 삭제
DELETE FROM test6;
COMMIT;
SELECT* FROM test6;

ALTER TABLE test6 ADD CONSTRAINT pk_test6_id PRIMARY KEY ( id );
-- 다시 기본키 추가
SELECT * FROM USER_CONSTRAINTS WHERE table_name= 'TEST6';
SELECT * FROM USER_CONS_COLUMNS WHERE table_name= 'TEST6';
-- 기본키가 추가되었음을 알 수 있다.

생성된 테이블에 기본키를 추가할 때는 ALTER TABLE 테이블명 ADD [ CONSTRAINT 제약조건명] PRIMARY KEY(기본키 설정하고 싶은 컬럼명); 으로 준다.


기본키 제약 조건을 삭제하려면 ?

ALTER TABLE test6 DROP PRIMARY KEY;
SELECT * FROM USER_CONSTRAINTS WHERE table_name= 'TEST6';
SELECT * FROM USER_CONS_COLUMNS WHERE table_name= 'TEST6';
-- 지워졌음을 알 수 있다.

ALTER TABLE 테이블명 DROP PRIMARY KEY; 로 삭제할 수 있다.

+ Recent posts