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
'Spring-Java > Oracle' 카테고리의 다른 글
Oracle Database 21c Express Edition install 롤백 현상 해결방법 (2) | 2023.09.11 |
---|---|
Day17_데이터 딕셔너리, JOIN, SUBQUERY, Java-OracleDB 연동(try-catch) (0) | 2023.09.05 |
Day15_오라클 DB 기본함수2 (날짜 , TYPE 변환 , 그룹화) (0) | 2023.09.04 |
Day14_DUAL TABLE, 오라클 DB 기본 함수 (0) | 2023.09.01 |
Day13_SCOTT schema, LIKE(와일드카드), DISTINCT, 연산자 (0) | 2023.08.31 |