✔ 테이블 제약조건
테이블에 입력될 값을 제한하는 것 제약조건은 컬럼별로 각각 지정할 수 있음
UNIQUE 제약조건 유일한 값만 입력될 수 있음(데이터 중복 금지), NULL 값은 허용
CREATE TABLE 테이블명(컬럼명 자료형(크기) 제약조건이름);
-- 1) UNIQUE 제약조건 : 유일한 값만 입력될 수 있음(데이터 중복 금지), NULL 값은 허용
-- 추가) NOT NULL 제약조건(*) : NULL 값이 입력될 수 없음
-- 예제 1) CUSTOMER 테이블을 정의하고 ID 컬럼에 UNIQUE 제약조건을 지정하세요
-- (ID VARCHAR2(20) --> UNIQUE 제약조건 지정
-- (PWD VARCHAR2(20)
-- (NAME VARCHAR2(20)
-- (PHONE VARCHAR2(30)
-- (ADDRESS VARCHAR2(1000)
CREATE TABLE CUSTOMER(
ID VARCHAR2(20) UNIQUE,
PWD VARCHAR2(20) NOT NULL,
NAME VARCHAR2(20) NOT NULL,
PHONE VARCHAR2(30),
ADDRESS VARCHAR2(1000)
);
✔ 기본키 제약조건
CREATE TABLE 테이블명(컬럼명 자료형(크기), CONSTRAINT 제약조건이름 PRIMARY KEY (컬럼명));
-- 기본키의 특징 : 유일한 값만 입력되고(중복방지) + NOT NULL 제약조건포함 + (참고 : INDEX 자동생성)
-- 특징) 주로 테이블 설계시 1개의 테이블당 거의 1개는 기본키가 존재함
-- 기본키 제약조건에 이름을 부여 : CONSTRAINT 제약조건이름 제약조건
-- 제약조건이름 붙이기 약속(명명법) : PK_테이블명_컬럼명
-- 사용법) CREATE TABLE 테이블명(컬럼명 자료형(크기), CONSTRAINT 제약조건이름 PRIMARY KEY(컬럼명));
CREATE TABLE CUSTOMER2(
ID VARCHAR2(20),
PWD VARCHAR2(20) NOT NULL,
NAME VARCHAR2(20) NOT NULL,
PHONE VARCHAR2(30),
ADDRESS VARCHAR2(1000),
CONSTRAINT PK_CUSTOMER2_ID PRIMARY KEY(ID) -- ID컬럼에 기본키 제약조건을 건다 제약조건이름은 PK_CUSTOMER_ID
SELECT * FROM CUSTOMER2; -- 조회
-- INSERT 테스트 : 기본키(유일성 + NOT NULL 지정)
INSERT INTO CUSTOMER2 VALUES(NULL, NULL, NULL, '010-123-4567', 'SEOUL'); -- 기본키로 인해 에러발생
✔ 외래키 제약조건
CONSTRAINT FK_테이블명_컬럼명 REFERENCES 부모테이블
-- 3) 외래키(참조키) 제약조건 : FOREIGN KEY(FK)
-- 무결성 제약조건 : 기본키 / 외래키(참조키)
-- 무결성 의미 : 데이터에 결점이 없는 것
-- 기본키 : 회원의 ID (중복되면 안됨 + NULL 입력되어도 안됨)
-- 참조키 : 부서테이블의 부서번호(DNO : 10 ~ 40), 사원테이블의 부서번호(DNO : 10 ~ 30) 있을때
-- 부서테이블의 부서번호 값만 사원테이블의 부서번호에 INSERT 할 수 있음(참조 무결성)
-- 만약 부서번호에 50번이 들어간다면 참조 무결성이 깨진 것
-- 사용법) CREATE TABLE 테이블명 (
-- 컬럼명 자료형(크기) CONSTRAINT 제약조건이름 PRIMARY KEY
-- 컬럼명 자료형(크기) CONSTRAINT 제약조건이름 REFERENCES 부모테이블명);
-- 예제3) EMP_SECOND 테이블을 만들고,
-- ENO NUMBER(4) (기본키)
-- ENAME VARCHAR2(10)
-- JOB VARCHAR2(9)
-- DNO NUMBER(2) (참조키)
-- 지정하세요
CREATE TABLE EMP_SECOND(
ENO NUMBER(4) CONSTRAINT PK_EMP_SECOND_ENO PRIMARY KEY -- 기본키 지정
,ENAME VARCHAR2(10)
,JOB VARCHAR2(9)
,DNO NUMBER(2) CONSTRAINT FK_EMP_SECOND_DNO REFERENCES DEPARTMENT -- 참조키 지정
);
✔ CHECK 제약조건
CONSTRAINT CK_EMP_SECOND_SALARY CHECK (조건)
-- 예제 4) EMP_SECOND 테이블에 CHECK 제약조건을 지정하세요 (SALARY>0 값만 INSERT 될 수 있도록)
CREATE TABLE EMP_SECOND(
ENO NUMBER(4) CONSTRAINT PK_EMP_SECOND_ENO PRIMARY KEY
,ENAME VARCHAR2(10)
,SALARY NUMBER(7,2) CONSTRAINT CK_EMP_SECOND_SALARY CHECK(SALARY > 0)
);
-- CHECK 제약조건 테스트
INSERT INTO EMP_SECOND VALUES(8000, '윤정화', -200);
✔ DEFAULT 제약조건
-- 예제 5)
CREATE TABLE EMP_SECOND(
ENO NUMBER(4) CONSTRAINT PK_EMP_SECOND_ENO PRIMARY KEY
,ENAME VARCHAR2(10)
,SALARY NUMBER(7,2) DEFAULT 1000
);
INSERT INTO EMP_SECOND(ENO, ENAME) VALUES(8000, '윤정화'); -- SALARY 값 미지정
COMMIT;
SELECT * FROM EMP_SECOND;
✔ 기타 제약조건
-- 기타사항 : 제약조건
-- 테이블 복사 : CREATE TABLE ~ AS SELECT ~
-- 제약조건 복사안됨(제약조건 추가 생성작업 : 기본키/참조키)
-- 참고) 시스템용 테이블 또는 뷰(VIEW): DB 관리용 테이블
-- 용도) 현재 생성된 테이블의 정보, 제약조건, 크기 등을 확인하는 용도
-- 테이블 정보(제약조건) : USER_CONSTRAINTS
-- 원본테이블 제약조건 확인
SELECT TABLE_NAME, CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME IN ('EMPLOYEE', 'DEPARTMENT')
ORDER BY TABLE_NAME;
-- 복사본테이블 제약조건 확인
SELECT TABLE_NAME, CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME IN ('EMP_COPY', 'DEPT_COPY')
ORDER BY TABLE_NAME;
✔ 테이블 생성 후 제약조건 추가/변경/제거하기
-- 예제 1) 사원복사본 테이블(EMP_COPY)에 기본키(PRIMARY KEY) 추가하기
-- 사용법) ALTER TABLE 테이블명
-- ADD CONSTRAINT PK_테이블명_컬럼명 PRIMARY KEY(컬럼명);
-- ENO : 사원번호에 기본키 추가
ALTER TABLE EMP_COPY
ADD CONSTRAINT PK_EMP_COPY_ENO PRIMARY KEY(ENO);
-- 예제2) 부서복사본(DEPT_COPY) 테이블에 기본키(PK) 추가하기
-- 기본키 : DNO(부서번호),(테이블의 데이터 중에서 유일한 값을 가져야 되는것)
ALTER TABLE DEPT_COPY
ADD CONSTRAINT PK_DEPT_COPY_DNO PRIMARY KEY(DNO);
-- 예제3) 테이블 생성 후에 외래키(참조키:FK) 추가하기 : EMP_COPY
-- 자식테이블에 추가 (부서테이블(부모): DEPT_COPY, 사원테이블(자식): EMP_COPY )
ALTER TABLE EMP_COPY
ADD CONSTRAINT FK_EMP_COPY_DNO
FOREIGN KEY(DNO) REFERENCES DEPT_COPY(DNO);
-- 예제4) 테이블 생성 후에 제약조건 삭제하기
-- 부모테이블(부서: 부서번호)의 기본키 <-> 자식테이블의 참조키(사원: 부서번호)
-- 부모테이블의 기본키 삭제하기 : 강제삭제하기 옵션(CASCADE)
-- CASCADE : 자식테이블에 있는 외래키도 같이 삭제됨
ALTER TABLE DEPT_COPY
DROP PRIMARY KEY; -- 자식테이블에 참조키가 걸려있으면 오류발생
ALTER TABLE DEPT_COPY
DROP PRIMARY KEY CASCADE;
-- 예제5) 제약조건 변경하기
-- EMP_COPY(사원) : ENAME (NULL 허용) -> ENAME NOT NULL 제약조건으로 변경
ALTER TABLE EMP_COPY
MODIFY ENAME CONSTRAINT NN_EMP_COPY_ENAME NOT NULL;
-- 제약조건이름으로 제약조건 삭제하기
ALTER TABLE EMP_COPY
DROP CONSTRAINT NN_EMP_COPY_ENAME;
✔ 연습문제
-- 13_Table_Constraint_Exam
-- 제약조건 연습문제
--— 1) EMPLOYEE 테이블의 구조를 복사하여 EMP_SAMPLE 란
-- 이름의 테이블을 만드시오.
--— 사원 테이블의 사원번호 컬럼(ENO)에
-- 테이블 레벨로 PRIMARY KEY 제약조건을 지정하되,
--— 제약 조건 이름은 PK_MY_EMP 하시오.
-- 1) 복사본 : 제약조건 복사 안됨(기본키,외래키 직접 생성해야 함)
-- 테이블 구조복사
CREATE TABLE EMP_SAMPLE
AS
SELECT * FROM EMPLOYEE
WHERE 1=2;
-- ENO에 PRIMARY KEY 제약조건 지정
ALTER TABLE EMP_SAMPLE
ADD CONSTRAINT PK_MY_EMP PRIMARY KEY(ENO);
--— 2) DEPARTMENT 테이블의 구조를 복사하여
-- DEPT_SAMPLE란 이름의 테이블을 만드시오.
--— 부서번호 컬럼(DNO)에 PRIMARY KEY 제약조건을 지정하되,
--— 제약 조건 이름은 PK_MY_DEPT 하시오.
-- 테이블 구조복사
CREATE TABLE DEPT_SAMPLE
AS
SELECT * FROM DEPARTMENT
WHERE 1=2;
-- DNO에 PRIMARY KEY 제약조건 지정
ALTER TABLE DEPT_SAMPLE
ADD CONSTRAINT PK_MY_DEPT PRIMARY KEY(DNO);
--— 3) 사원 테이블의(EMP_SAMPLE) 부서번호 컬럼에 존재하지 않는
-- 부서의 사원이 배정되지 않도록
--— 외래 키(FOREIGN KEY:FK) 제약조건을 지정하되,
-- FK_MY_DEPT_EMP 로 하시오.
--— 참조테이블 : DEPARTMENT (데이터가 있음)
--— 참조키,외래키(FOREIGN KEY:FK)
-- DNO 컬럼에 외래키 지정
ALTER TABLE EMP_SAMPLE
ADD CONSTRAINT FK_MY_DEPT_EMP
FOREIGN KEY(DNO) REFERENCES DEPARTMENT(DNO);
SELECT TABLE_NAME, CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME IN ('EMP_SAMPLE', 'DEPT_SAMPLE')
ORDER BY TABLE_NAME;