01. 제약 조건 종류
1. NOT NULL - 값이 없는 것을 허용 안함
2. UNIQUE - 중복 허용 안함
3. PK(PRIMARY KEY) - 한 로를 대표하는 유일한 키(컬럼-1, 2개 이상)
- INDEX 자동 생성
- NOT NULL 자동 생성
4. FK(FOREIGN KEY) - 다른 테이블을 참조하는 키(EMP.DEPTNO => DEPT.DEPTNO)
5. CHECK
- 컬럼에 조건을 줘서 입력 값이 조건에 만족해야 하는 것
- 조건 만족X 에러
6. DEFAULT
- 컬럼에 입력 값이 없을 때 자동적으로 어떤 값을 집어 입력하는 것
제약 조건 확인
- USER_CONSTRINTS
열 이름 설명
OWNER | 제약 조건 소유 계정 |
CONSTRAINT_NAME | 제약 조건 이름(직접 지정하지 않을 경우 오라클이 자동으로 지정함) |
CONSTRAINT_TYPE | 제약 조건 종류C : CHECK, NOT NULLU : UNIQUEP : PRIMARY KEYR : FOREIGN KEY |
TABLE_NAME | 제약 조건을 지정한 테이블 이름 |
1. NOT NULL
테이블 생성할 때 NOT NULL 설정하기
-- 실습 14-1
CREATE TABLE TABLE_NOTNULL(
LOGIN_ID VARCHAR2(20) NOT NULL,
LOGIN_PWD VARCHAR2(20) NOT NULL,
TEL VARCHAR2(20)
);
DESC TABLE_NOTNULL;
제약 조건이 NOT NULL인 열에 NULL 값 넣어보기
-- 실습 14-2
INSERT INTO TABLE_NOTNULL (LOGIN_ID, LOGIN_PWD, TEL)
VALUES ('TEST_ID_01', NULL, '010-1234-5678');
# 에러
NOT NULL 제약 조건이 지정된 열 데이터를 NULL 값으로 업데이트하기
-- 실습 14-4
UPDATE TABLE_NOTNULL
SET LOGIN_PWD = NULL
WHERE LOGIN_ID = 'TEST_ID_01';
# 에러
테이블을 생성할 때 제약 조건에 이름 지정하기
-- 실습 14-6
CREATE TABLE TABLE_NOTNULL2(
LOGIN_ID VARCHAR2(20) CONSTRAINT TBLNN2_LGNID_NN NOT NULL,
LOGIN_PWD VARCHAR2(20) CONSTRAINT TBLNN2_LGNPW_NN NOT NULL,
TEL VARCHAR2(20)
);
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME = 'TABLE_NOTNULL2';
TEL 열에 NOT NULL 제약 조건 추가하기
-- 실습 14-7
ALTER TABLE TABLE_NOTNULL
MODIFY(TEL NOT NULL);
SELECT * FROM TABLE_NOTNULL;
DESC TABLE_NOTNULL;
TEL 열 데이터 수정하기
-- 실습 14-8
UPDATE TABLE_NOTNULL
SET TEL = '010-1234-5678'
WHERE LOGIN_ID = 'TEST_ID_01';
SELECT * FROM TABLE_NOTNULL;
NOT NULL 제약 조건 추가하기
-- 실습 14-9
ALTER TABLE TABLE_NOTNULL
MODIFY(TEL NOT NULL);
DESC TABLE_NOTNULL;
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME = 'TABLE_NOTNULL';
제약 조건에 이름 지정해서 추가하기
-- 실습 14-10
DESC TABLE_NOTNULL2
SELECT * FROM TABLE_NOTNULL2;
ALTER TABLE TABLE_NOTNULL2
MODIFY(TEL CONSTRAINT TBLNN_TEL_NN NOT NULL);
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME = 'TABLE_NOTNULL2';
TABLE_NOTNULL2 테이블 열 구조 확인하기
-- 실습 14-11
DESC TABLE_NOTNULL2;
이미 생성된 제약 조건 이름 변경하기
-- 실습 14-12
ALTER TABLE TABLE_NOTNULL2
RENAME CONSTRAINT TBLNN_TEL_NN TO TBLNN2_TEL_NN;
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME = 'TABLE_NOTNULL2';
제약 조건 삭제하기
-- 실습 14-13
ALTER TABLE TABLE_NOTNULL2
DROP CONSTRAINT TBLNN2_TEL_NN;
DESC TABLE_NOTNULL2;
2. UNIQUE
제약 조건 지정하기
-- 실습 14-14
CREATE TABLE TABLE_UNIQUE(
LOGIN_ID VARCHAR2(20) UNIQUE,
LOGIN_PWD VARCHAR2(20) NOT NULL,
TEL VARCHAR2(20)
);
DESC TABLE_UNIQUE;
TABLE_UNIQUE 테이블에 데이터 입력하기
-- 실습 14-16
INSERT INTO TABLE_UNIQUE(LOGIN_ID, LOGIN_PWD, TEL)
VALUES('TEST_ID_01', 'PWD01', '010-1234-5678');
SELECT * FROM TABLE_UNIQUE;
LOGIN_ID열에 중복되는 데이터 넣기
-- 실습 14-17
INSERT INTO TABLE_UNIQUE (LOGIN_ID, LOGIN_PWD, TEL)
VALUES ('TEST_ID_01', 'PWD01', '010-1234-5678');
TABLE_UNIQUE 테이블에 데이터 입력하기
-- 실습 14-18
INSERT INTO TABLE_UNIQUE(LOGIN_ID, LOGIN_PWD, TEL)
VALUES('TEST_ID_02', 'PWD01', '010-1234-5678');
SELECT * FROM TABLE_UNIQUE;
UNIQUE 제약 조건이 지정된 열에 NULL 값 입력하기
-- 실습 14-19
INSERT INTO TABLE_UNIQUE(LOGIN_ID, LOGIN_PWD, TEL)
VALUES(NULL, 'PWD01', '010-2345-6789');
SELECT * FROM TABLE_UNIQUE;
TABLE_UNIQUE 테이블 데이터 수정하기
-- 실습 14-20
UPDATE TABLE_UNIQUE
SET LOGIN_ID='TEST_ID_01'
WHERE LOGIN_ID IS NULL;
이미 생성한 테이블 열에 UNIQUE 제약 조건 추가하기
-- 실습 14-23
ALTER TABLE TABLE_UNIQUE
MODIFY(TEL UNIQUE);
SELECT * FROM TABLE_UNIQUE;
TEL 열 값을 모두 NULL 값으로 변경하기
-- 실습 14-24
UPDATE TABLE_UNIQUE
SET TEL = NULL;
SELECT * FROM TABLE_UNIQUE;
TEL 값에 UNIQUE 제약 조건 설정하기
-- 실습 14-25
ALTER TABLE TABLE_UNIQUE
MODIFY(TEL UNIQUE);
UNIQUE 제약 조건 이름 직접 지정하기
-- 실습 14-26
ALTER TABLE TABLE_UNIQUE2
MODIFY(TEL CONSTRAINT TBLUNQ_TEL_UNQ UNIQUE);
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME LIKE 'TABLE_UNIQUE%';
이미 만들어져 있는 UNIQUE 제약 조건 이름 수정하기
-- 실습 14-27
ALTER TABLE TABLE_UNIQUE2
RENAME CONSTRAINT TBLUNQ_TEL_UNQ TO TBLUNQ2_TEL_UNQ;
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME LIKE 'TABLE_UNIQUE%';
제약 조건 삭제하기
-- 실습 14-28
ALTER TABLE TABLE_UNIQUE2
DROP CONSTRAINT TBLUNQ2_TEL_UNQ;
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME LIKE 'TABLE_UNIQUE%';
3. USER_CONSTRAINTS
데이터 사전 뷰로 제약 조건 확인하기
-- 실습 14-15
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME = 'TABLE_UNIQUE';
4. PRIMARY KEY
테이블을 생성할 때 특정 열에 PRIMARY KEY 설정하기
-- 실습 14-29
CREATE TABLE TABLE_PK(
LOGIN_ID VARCHAR2(20) PRIMARY KEY,
LOGIN_PWD VARCHAR2(20) NOT NULL,
TEL VARCHAR2(20)
);
DESC TABLE_PK;
생성한 PRIMARY KEY 확인하기
-- 실습 14-30
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME LIKE 'TABLE_PK%';
생성한 PRIMARY KEY를 통해 자동 생성된 INDEX 확인하기
-- 실습 14-31
SELECT INDEX_NAME, TABLE_OWNER, TABLE_NAME
FROM USER_INDEXES
WHERE TABLE_NAME LIKE 'TABLE_PK%';
제약 조건의 이름을 직접 지정하여 테이블 생성하기
-- 실습 14-32
CREATE TABLE TABLE_PK2(
LOGIN_ID VARCHAR2(20) CONSTRAINT TBLPK2_LGNID_PK PRIMARY KEY,
LOGIN_PWD VARCHAR2(20) CONSTRAINT TBLPK2_LGNPW_NN NOT NULL,
TEL VARCHAR2(20)
);
DESC TABLE_PK2;
TABLE_PK 테이블에 데이터 입력하기
-- 실습 14-33
INSERT INTO TABLE_PK(LOGIN_ID, LOGIN_PWD, TEL)
VALUES('TEST_ID_01', 'PWD01', '010-1234-5678');
SELECT * FROM TABLE_PK;
TABLE_PK 테이블에 중복되는 데이터 입력하기
-- 실습 14-34
INSERT INTO TABLE_PK(LOGIN_ID, LOGIN_PWD, TEL)
VALUES('TEST_ID_01', 'PWD02', '010-2345-6789');
5. FOREIGN KEY
EMP 테이블과 DEPT 테이블의 제약 조건 살펴보기
-- 실습 14-37SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME, R_OWNER, R_CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME IN ('EMP', 'DEPT');
FOREGIN KEY가 참조하는 열에 존재하지 않는 데이터 입력하기
-- 실습 14-38
INSERT INTO EMP(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES(9999, '홍길동', 'CLERK', '7788', TO_DATE('2017/04/30', 'YYYY/MM/DD'), 1200, NULL, 50);
DEPT_FK 테이블 생성하기
-- 실습 14-39
CREATE TABLE DEPT_FK(
DEPTNO NUMBER(2) CONSTRAINT DEPTFK_DEPTNO_PK PRIMARY KEY,
DNAME VARCHAR2(14),
LOC VARCHAR2(13)
);
DESC DEPT_FK;
EMP_FK 테이블 생성하기
-- 실습 14-40
CREATE TABLE EMP_FK(
EMPNO NUMBER(4) CONSTRAINT EMPFK_EMPNO_PK PRIMARY KEY,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2) CONSTRAINT EMPFK_DEPTNO_FK REFERENCES DEPT_FK (DEPTNO)
);
DESC EMP_FK;
EMP_FK 테이블에 데이터 삽입하기(DEPTNO 데이터가 아직 DEPT_FK 테이블에 없을 때)
-- 실습 14-41INSERT INTO EMP_FK
VALUES(9999, 'TEST_NMAME', 'TEST_JOB', NULL, TO_DATE('2001/01/01', 'YYYY/MM/DD'),
3000, NULL, 10);
DEPT_FK에 데이터 삽입하기
-- 실습 14-42INSERT INTO DEPT_FK
VALUES(10, 'TEST_DNAME', 'TEST_LOC');
SELECT * FROM DEPT_FK;
EMP_FK 테이블에 데이터 삽입하기
-- 실습 14-43INSERT INTO EMP_FK
VALUES(9999, 'TEST_NMAME', 'TEST_JOB', NULL, TO_DATE('2001/01/01', 'YYYY/MM/DD'),
3000, NULL, 10);
SELECT * FROM EMP_FK;
DEPT_FK 테이블의 10번 부서 데이터 삭제하기
-- 실습 14-44DELETE FROM DEPT_FK
WHERE DEPTNO = 10;
# 에러
6. CHECK
테이블을 생성할 때 CHECK 제약 조건 설정하기
-- 실습 14-45
CREATE TABLE TABLE_CHECK(
LOGIN_ID VARCHAR2(20) CONSTRAINT TBLCK_LOGINID_PK PRIMARY KEY,
LOGIN_PWD VARCHAR2(20) CONSTRAINT TBLCK_LOGINPW_CK CHECK (LENGTH(LOGIN_PWD) > 3),
TEL VARCHAR2(20)
);
DESC TABLE_CHECK;
CHECK 제약 조건에 맞지 않는 예
-- 실습 14-46
INSERT INTO TABLE_CHECK
VALUES ('TEST_ID', '123', '010-1234-5678');
# 에러
CHECK 제약 조건에 맞는 예
-- 실습 14-47
INSERT INTO TABLE_CHECK
VALUES ('TEST_ID', '1234', '010-1234-5678');
SELECT * FROM TABLE_CHECK;
CHECK 제약 조건 확인하기
-- 실습 14-48
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME LIKE 'TABLE_CHECK';
7. DEFAULT
테이블을 생성할 때 DEFAULT 제약 조건 설정하기
-- 실습 14-49
CREATE TABLE TABLE_DEFAULT(
LOGIN_ID VARCHAR2(20) CONSTRAINT TBLCK2_LOGINID_PK PRIMARY KEY,
LOGIN_PWD VARCHAR2(20) DEFAULT '1234',
TEL VARCHAR2(20)
);
DESC TABLE_DEFAULT;
DEFAULT로 지정한 기본값이 입력되는 INSERT문 확인하기
-- 실습 14-50
INSERT INTO TABLE_DEFAULT VALUES ('TEST_ID', NULL, '010-1234-5678');
INSERT INTO TABLE_DEFAULT (LOGIN_ID, TEL) VALUES ('TEST_ID2', '010-1234-5678');
SELECT * FROM TABLE_DEFAULT;
'SQL > 개념' 카테고리의 다른 글
11. 사용자, 권한, 롤 관리 (0) | 2023.05.09 |
---|---|
09. 객체 종류 (0) | 2023.05.09 |
08. 데이터 정의어(DDL) (0) | 2023.05.09 |
07. 트랜잭션 제어와 세션(TCL) (0) | 2023.05.09 |
06. 데이터 조작어(DML) (0) | 2023.05.08 |