본문 바로가기
Spring-Java/Oracle

Day16_CONSTRAINT(제약조건)

by 현대타운301 2023. 9. 4.

2023.09.04

 

Day16 세 줄 요약

- CONSTRAINT로 제약조건 설정가능

- PRIMARY KEY는 한 테이블에 하나만 할당할 수 있다.

- 일반적으로 FOREIGN KEY로 데이터를 참조할 땐 PRIMARY KEY 컬럼 데이터를 참조 (중복되지 않고 비어있지 않은 값이므로).

 


 

CONSTRAINT

 

테이블의 특정 컬럼에 지정, 제약조건에 부합하지 않은 데이터는 저장 불가

 

 

무결성 제약조건

" 데이터의 무결성은 데이터베이스에 저장된 데이터의 일관성과 정확성을 지키는 것을 말한다.
일관성과 정확성을 잃어버린 데이터베이스는 정보로서의 가치에 심각한 문제가 있다. "

 

 

영역 무결성 (도메인 제약)
테이블 내의 TUPLE들이 각 속성의 도메인에 저장된 값만 가져야 한다.
 


개체 무결성 (기본키(PK) 제약)
테이블에서 기본키를 저장하고 그에 따른 무결성 원칙
     - 기본키는 'NULL(비어있음)'을 가져서는 안되고, 테이블 내에 오직 하나만 존재

 

 

참조 무결성 (외래키(FK) 제약)
테이블 간의 참조 관계를 선언하는 제약조건
     - 일반적으로 참조되는 테이블을 '부모테이블', 참조하는 테이블을 '자식테이블' 이라 한다.


제약조건의 종류
1) PRIMARY KEY(PK) : 기본키

     - NOT NULL + UNIQUE : NULL 값을 허용하지 않고 중복되지 않아야 함

2) CHECK : 특정 조건 수립

3) NOT NULL : NULL 값을 허용하지 않음

4) UNIQUE : 중복을 허용하지 않음

5) DEFAULT : 기본값 설정시 사용

6) FOREIGN KEY(FK) : 외래키

CREATE TABLE RSMEMBER(
	/*
   		ALTER TABLE ADD CONSTRAINT PK_RS_CD PRIMARY KEY(RS_CODE)와 같음
   	 	제약조건의 이름을 설정하지 않으면 자동으로 이름설정
    	*/
    
    -- 1) PRIMARY KEY(PK) : 하나의 테이블에서 TUPLE을 구분 지을 수 있는 특정 컬럼의 유일 값
        -- NOT NULL + UNIQUE
        -- ex) 학번, 주민번호, 핸드폰번호, ... (다양한 후보키 중 가장 적절한 값 선택)
    RS_CODE     NUMBER CONSTRAINT PK_RS_CD PRIMARY KEY,
    
    -- 2) CHECK : 컬럼에 특정 조건 부여
    RS_NAME     NVARCHAR2(5) CHECK(LENGTH(RS_NAME) >= 2),
    
    -- 3) NOT NULL : NULL(비어있음)을 허용하지 않음
    RS_PW       NVARCHAR2(4) CONSTRAINT NN_RS_PW NOT NULL,
   
   -- 4) UNIQUE : 중복을 허용하지 않음
    RS_PHONE    NVARCHAR2(11) CONSTRAINT UN_RS_PH UNIQUE,
   
   -- 5) DEFAULT : 기본 값 설정
    RS_CLASS    NUMBER DEFAULT 503,
   
   -- 6) FORIEGN KEY(FK)
    RS_GROUP    NUMBER,
    CONSTRAINT FK_RS_GR FOREIGN KEY(RS_GROUP) REFERENCES RSGROUP(RS_GROUP)
);

-- RSMEMBER 테이블의 RS_GROUP 컬럼이 RSGROUP 테이블에서 참조
-- RSGROUP : 부모 TABLE
-- RSMEMBER : 자식 TABLE
CREATE TABLE RSGROUP(
    RS_GROUP NUMBER PRIMARY KEY,
    GROUP_NAME NVARCHAR2(20)
);

/*	
	<중요!>  CREATE 순서는 부모-자식 순서여야 함
	위의 경우, CREATE TABLE RSGROUP -> CREATE TABLE RSMEMBER 순서
*/

 

 

제약조건(CONSTRAINT)을 확인하는 SQL

ALL_CONTRAINTS (WHERE OWNER = ___; )

SELECT * FROM ALL_CONSTRAINTS
WHERE OWNER = 'ICIA';     -- OWNER를 지정해서 조회가능

 

 

BIN$ TABLE 삭제

PURGE RECYCLEBIN;

PURGE RECYCLEBIN;
SELECT * FROM ALL_CONSTRAINTS WHERE OWNER = 'ICIA';

 

 

PRIMARY KEY(기본키) 삭제

ALTER TABLE RSMEMBER DROP CONSTRAINT PK_RS_CD;	-- PK 삭제
SELECT * FROM ALL_CONSTRAINTS WHERE OWNER = 'ICIA';

 

 

제약(CONSTRAINT) 유형

P : PRIMARY KEY

R : FOREIGN KEY

U : UNIQUE

C : CHECK, NOT NULL

 


 

예제

 

source code


/*
    UNIQUE
    NOT NULL
    PRIMARY KEY
    FOREIGN KEY
    CHECK
    DEFAULT
*/


DROP TABLE ORDERS;
DROP TABLE BUYER;
DROP TABLE SELLER;
DROP TABLE GOODS;


CREATE TABLE GOODS(
    G_NO    NUMBER,         -- 상품 번호(PRIMARY)
    G_NAME  NVARCHAR2(10),  -- 상품 이름(UNIQUE)
    G_PRICE NUMBER,         -- 상품 가격(CHECK > 0)
    CONSTRAINT PK_GOODS_NO PRIMARY KEY(G_NO),
    CONSTRAINT UN_G_NAME UNIQUE(G_NAME),
    CHECK(G_PRICE > 0)
);
INSERT INTO GOODS VALUES(1, 'A', 10000);
INSERT INTO GOODS VALUES(2, 'B', 20000);
INSERT INTO GOODS VALUES(3, 'C', 30000);


CREATE TABLE BUYER(
    B_NO    NUMBER,         -- 구매자 번호(PRIMARY)
    B_NAME  NVARCHAR2(10)	-- 구매자 이름(NOT NULL)
    CONSTRAINT NN_B_NAME NOT NULL,
    CONSTRAINT PK_BUYER_NO PRIMARY KEY(B_NO)
);
INSERT INTO BUYER VALUES(1, '홍길동');
INSERT INTO BUYER VALUES(2, '이순신');
INSERT INTO BUYER VALUES(3, '아이유');


CREATE TABLE SELLER(
    S_NO    NUMBER,         -- 판매자 번호(PRIMARY)
    S_NAME  NVARCHAR2(10)	-- 판매자 이름(NOT NULL)
    CONSTRAINT NN_S_NAME NOT NULL,
    CONSTRAINT PK_SELLER_NO PRIMARY KEY(S_NO)
);
INSERT INTO SELLER VALUES(1, '김자바');
INSERT INTO SELLER VALUES(2, '박전자');
INSERT INTO SELLER VALUES(3, '이디비');


CREATE TABLE ORDERS(
    ORDER_NO    NUMBER,     -- 주문 번호(PRIMARY)
    O_BUYER_NO  NUMBER,     -- 구매자 번호(FOREIGN)
    O_SELLER_NO NUMBER,     -- 판매자 번호(FOREIGN)
    O_GOODS_NO  NUMBER,		-- 상품 번호(FOREIGN)
    CONSTRAINT PK_ORDER_NO PRIMARY KEY(ORDER_NO),
    CONSTRAINT FK_O_BUYER_NO FOREIGN KEY(O_BUYER_NO) REFERENCES BUYER(B_NO),
    CONSTRAINT FK_O_SELLER_NO FOREIGN KEY(O_SELLER_NO) REFERENCES SELLER(S_NO),
    CONSTRAINT FK_O_GOODS_NO FOREIGN KEY(O_GOODS_NO) REFERENCES GOODS(G_NO)
);
INSERT INTO ORDERS VALUES(1, 1, 1, 1);
INSERT INTO ORDERS VALUES(2, 2, 2, 2);
INSERT INTO ORDERS VALUES(3, 3, 3, 3);


PURGE RECYCLEBIN;
SELECT * FROM ALL_CONSTRAINTS WHERE OWNER = 'ICIA';

 

 

CONSTRAINTS