KH정보교육원_웹 프로그래머 과정/Oracle DB

Database 기본7 (제약조건)

calvin9150 2021. 3. 10. 20:26
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
----------------- 2021-03-10
-- 제약 조건
-- NOT NULL : 지정한 열에 NULL을 허용하지 않음. NULL 제외한 데이터의 중복 허용. (C)
-- UNIQUE : 지정한 열이 유일한 값을 가져야 함(중복 비허용). 오라클에선 NULL은 중복에서 제외된다. (U)
-- PRIMARY KEY : 지정한 열이 유일한 값이면서 NULL 비허용. 테이블에 하나만 지정 가능. (P)
-- FOREIGN KEY : 다른 테이블의 열을 참조해서 존재하는 값만 입력 가능. 참조할 열에는 중복값이 없어야 함. (R)
-- CHECK : 설정한 조건식을 만족하는 데이터만 입력 가능. (C)
 
-- 테이블에 설정된 제약 조건 확인
SELECT *
FROM USER_CONSTRAINTS;
SELECT*FROM USER_CONS_COLUMNS;
-- 테이블에 대한 제약 조건을 검색할 땐 2개 테이블을 조인해서 사용
SELECT*
FROM USER_CONSTRAINTS
JOIN USER_CONS_COLUMNS USING(CONSTRAINT_NAME);
 
-- NOT NULL
SELECT * FROM MEMBER;
CREATE TABLE CONS_NN(
    USER_NO NUMBER,
    USER_NAME VARCHAR2(20),
    EROLL_DATE DATE
); -- 일반적인 테이블 생성
DROP TABLE CONS_NN;
 
CREATE TABLE CONS_NN(
    USER_NO NUMBER NOT NULL,
    USER_NAME VARCHAR2(20NOT NULL,
    EROLL_DATE DATE
); -- NOT NULL 설정
 
INSERT INTO CONS_NN VALUES (NULLNULLNULL); -- 삽입 불가
 
-- UNIQUE
CREATE TABLE TBL_USER_UQ(
    USER_NO NUMBER,
    USER_ID VARCHAR2(20UNIQUE ,
    USER_PWD VARCHAR2(20),
    USER_NAME VARCHAR2(20),
    EMAIL VARCHAR2(20UNIQUE
);
--유니크 그룹화
CREATE TABLE TBL_USER_UQ(
    USER_NO NUMBER,
    USER_ID VARCHAR2(20NOT NULL UNIQUE,
    USER_PWD VARCHAR2(20),
    USER_NAME VARCHAR2(20),
    EMAIL VARCHAR2(20),
    UNIQUE (USER_ID, EMAIL) -- 그룹화.. 윗 테이블의 유니크랑 다름.
);
 
DROP TABLE TBL_USER_UQ;
SELECT*FROM TBL_USER_UQ;
INSERT INTO TBL_USER_UQ VALUES (1'GOM''1234''JANG''JANG@NAVER.COM'); -- 중복 삽입 불가
 
-- PRIMARY KEY : 중복값 없고 NULL도 없어야 함. 한 테이블당 한 PK만 가능.
CREATE TABLE TBL_USER_PK(
    USER_NO NUMBER PRIMARY KEY,
    USER_ID VARCHAR2(20NOT NULL UNIQUE,
    USER_PWD VARCHAR2(20NOT NULL
);
 
-- 상품, 날짜, 수량, 아이디, 주문번호
CREATE TABLE TBL_ORDER(
    PRODUCT_NO NUMBER,
    USER_ID VARCHAR2(20),
    ORDER_DATE DATE,
    COUNT NUMBER,
    ORDER_NO NUMBER,
    PRIMARY KEY (PRODUCT_NO, USER_ID, ORDER_DATE)
);
DROP TABLE TBL_ORDER;
INSERT INTO TBL_ORDER VALUES (2'ADMIN''21/03/10',10,1);
SELECT*FROM TBL_ORDER;
 
-- 외래키 (FOREIGN KEY) : 다른 테이블의 열을 참조해서 존재하는 값만 입력 가능. 참조할 열에는 중복값이 없어야 함. (R)
-- 카테고리, 부서명 , 학과명
-- 부모자식 관계가 성립
 
-- 게시판
CREATE TABLE BOARD (
    BOARD_NO NUMBER,
    BOARD_TITLE VARCHAR2(20NOT NULL,
    BOARD_CONTENT VARCHAR2(2000),
    BOARD_WRITE VARCHAR2(20REFERENCES MEMBER(USER_ID), -- 밑 테이블 MEMBER가 글을 쓰는 것이니, FOREIGN 사용
    BOARD_DATE DATE
);
DROP TABLE BOARD;
DROP TABLE MEMBER;
CREATE TABLE MEMBER(
    USER_ID VARCHAR2(20NOT NULL UNIQUE ,
    USER_PWD VARCHAR2(20)
);
 
INSERT INTO MEMBER VALUES ('USER01','USER01');
SELECT*FROM MEMBER;
INSERT INTO BOARD VALUES (1'무야호'NULL,'USER01', SYSDATE);
SELECT*FROM BOARD;
 
CREATE TABLE SHOP_BUY(
    BUY_NO NUMBER PRIMARY KEY ,
    USER_ID VARCHAR2(20NOT NULL,
    PRODUCT_NAME VARCHAR2(50),
    REG_DATE DATE,
    FOREIGN KEY (USER_ID) REFERENCES MEMBER2(USER_ID) ON DELETE SET NULL
);
 
SELECT * FROM SHOP_BUY;
INSERT INTO SHOP_BUY VALUES (1'USER01''AIR CONDITIONAL', SYSDATE);
INSERT INTO SHOP_BUY VALUES (3'USER02''AIR CONDITIONAL', SYSDATE); -- USER02는 MEMBER 테이블에 없으므로 ERROR
 
CREATE TABLE MEMBER2(
    USER_ID VARCHAR2(20UNIQUE,
    USER_PWD VARCHAR2(20)
);
 
SELECT * FROM MEMBER2;
DROP TABLE SHOP_BUY;
DROP TABLE MEMBER2;
 
-- 참조된 값은 함부로 데이터를 수정하지 못하게 만듦
SELECT * FROM BOARD;
DELETE FROM MEMBER2 WHERE USER_ID='USER01'-- 참조중인 테이블이 있어서 실행안됨
DELETE FROM BOARD WHERE BOARD_WRITE='USER01'-- BOARD_WRITE에서 참조하고 있어서 이걸 실행하면 위 MEMBER에서 지울 수 있다
 
-- ㄴ 잠조관계 있을 땐, 못지우는게 DEFAULT지만 옵션 설정시 가능.
-- ON DELETE SET NULL / ON CASCADE
 
INSERT INTO MEMBER2 VALUES('USER01''USER01')
INSERT INTO SHOP_BUY VALUES(1'USER01''아이스크림', SYSDATE);
 
-- CHECK : 내가 설정한 값만 저장가능
CREATE TABLE USER_CHECK(
    USER_NO NUMBER,
    USER_NAME VARCHAR2(20),
    GENDER VARCHAR2(10) CHECK(GENDER IN('남','여')),
    AGE NUMBER,
    CHECK(AGE BETWEEN 10 AND 30)
);
INSERT INTO USER_CHECK VALUES (1,'곰저씨','남',20); -- 가능
SELECT*FROM USER_CHECK;
DROP TABLE USER_CHECK;
 
CREATE TABLE CONS_NAME(
    USER_ID VARCHAR2(20CONSTRAINT CONS_NAME_PK PRIMARY KEY,
    USER_NAME VARCHAR2(20),
    CONSTRAINT USER_NAME_UQ UNIQUE (USER_NAME)
);
 
SELECT * FROM USER_CONS_COLUMNS
WHERE TABLE_NAME = 'CONS_NAME';
cs