개발자꿈나무
제약 조건 본문
- NOT NULL : NULL 허용하지 않음, NULL을 제외한 데이터 중복은 허용
- UNIQUE : 지정한 열이 유일한 값을 가져야함. 중복 불가. NULL은 중복 가능
- PRIMARY KEY : 유일한 값이면서 NULL 허용하지 않음, 테이블에 하나만 지정 가능
- FOREIGN KEY : 다른 테이블의 열을 참조하여 존재하는 값만 입력 가능
- CHECK : 설정한 조건식을 만족하는 데이터만 입력 가능
-- 제약 조건은 데이터 무결성을 보장하기 위해 제공됨
종류 | 설명 |
영역 무결성 (domain integrity) |
열에 저장되는 값의 적정 여부를 확인. 자료형, 적절한 형식의 데이터, NULL 여부 값은 정해 놓은 범위를 만족하는 데이터임을 규정 |
개체 무결성 (entity integrity) |
테이블 데이터를 유일하게 식별할 수 있는 기본키는 반드시 값을 가지고있어야 하며 NULL이 될 수 없고 중복될 수도 없음 |
참조 무결성 (referential integrity) |
참조 테이블의 외래키 값은 참조 테이블의 기본키로서 존재해야 하며 NULL이 가능 |
- NOT NULL
CREATE TABLE T_NULL(ID VARCHAR2(20) NOT NULL, PWD VARCHAR2(20) NOT NULL, TEL VARCHAR(15));
INSERT INTO T_NULL VALUES('multi','1234',NULL); -- 삽입 가능
commit; -- id와 pwd열에 not null 제약 조건 지정
-- USER_CONSTRAINTS : 데이터 사전 제약 조건 확인
SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME ='T_NN1'; -- TYPE : C (NOT NULL,CHECK)
CREATE TABLE T_NN1(
ID VARCHAR2(20) CONSTRAINT T_NN1_ID NOT NULL,
PWD VARCHAR2(20) CONSTRAINT T_NN1_PWD NOT NULL,
TEL VARCHAR(15)
);
ALTER TABLE T_NN1 MODIFY(TEL CONSTRAINT T_NN1_TEL NOT NULL); --NN1_TEL이라는 제약 조건 수정
ALTER TABLE T_NN1 RENAME CONSTRAINT SYS_C0011069 TO T_NN1_TEL; --제약 조건 이름 수정
ALTER TABLE T_NN1 DROP CONSTRAINT T_NN1_TEL; --제약 조건 삭제
- UNIQUE
CREATE TABLE T_UNIQUE(
ID VARCHAR2(20) UNIQUE, PWD VARCHAR2(20) NOT NULL, TEL VARCHAR(15)
);
SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME ='T_UNIQUE';
ALTER TABLE T_UNIQUE RENAME CONSTRAINT SYS_C0011070 TO T_PW_NN;
ALTER TABLE T_UNIQUE RENAME CONSTRAINT SYS_C0011071 TO T_ID_UQ;
INSERT INTO T_UNIQUE(ID,PWD,TEL) VALUES ('TEST','1234','11111');
INSERT INTO T_UNIQUE(ID,PWD,TEL) VALUES (NULL,'12345','11111111');
SELECT * FROM T_UNIQUE;
-- 만약 ID값이 null인 값들을 'test'로 수정하려고 한다면?
UPDATE T_UNIQUE SET ID = 'TEST' WHERE ID IS NULL; -- 오류. unique조건이 걸려있으므로 같은 데이터 중복 저장 불가
-- 'test1, test2 ..'로 값을 지정해주기 위한 두가지 방법(rownum, sequence)
UPDATE T_UNIQUE SET ID = 'TEST'||ROWNUM WHERE ID IS NULL;
CREATE SEQUENCE TT INCREMENT BY 2 START WITH 0 MINVALUE 0;
UPDATE T_UNIQUE SET ID = 'TEST'||TT.NEXTVAL WHERE ID LIKE '%TEST%';
- PRIMARY KEY
CREATE TABLE T_PK(
ID VARCHAR2(20) CONSTRAINT T_ID_PK PRIMARY KEY, PWD VARCHAR2(20) CONSTRAINT T_PWD_NN NOT NULL, TEL VARCHAR(15)
);
SELECT * FROM USER_CONSTRAINTS;
- FOREIGN KEY
SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME IN('EMP','DEPT');
SELECT DEPTNO FROM EMP;
SELECT DEPTNO FROM DEPT;
INSERT INTO EMP(EMPNO, ENAME, DEPTNO) VALUES (9999,'BROWN',50); -- foreign key로 지정되어 있어서 50 추가 불가
-- 만약 데이터를 삽입한 이후에 외래키를 주고 싶을 경우
ALTER TABLE [TABLE_NAME] ADD CONSTRAINT [CONSTRAINT_NAME] FOREIGN KEY [COLUMN_NAME] REFERENCES [PARENTS_TABLE_NAME] (PK COLUMN NAME)
- CHECK
CREATE TABLE EMP_CHECK(
LOGIN_ID NUMBER(4) CONSTRAINT EMP_LOGIN_PK PRIMARY KEY,
LOGIN_PWD VARCHAR2(20) CONSTRAINT EMP_PWD_CK CHECK (LENGTH(LOGIN_PWD) > 3),
SAL NUMBER(5) CONSTRAINT EMP_SAL_CK CHECK (SAL > 0 AND SAL < 8000),
GENDER CHAR(1) CONSTRAINT EMP_GEN_CK CHECK ( GENDER IN ('M','F')),
ENAME VARCHAR2(10) DEFAULT '홍길동',
TEL VARCHAR2(20) DEFAULT '000-0000-0000');
-- check 조건을 걸면 check조건을 벗어나는 데이터는 입력이 안됨
INSERT INTO EMP_CHECK VALUES(3333,'2222',40000,'M','고길동','010-333-3333');
-- sal의 조건범위를 벗어났으므로 에러뜸
INSERT INTO EMP_CHECK (LOGIN_ID, LOGIN_PWD, SAL, GENDER, ENAME, TEL)
VALUES (2222, '1234', 3000, 'F');
-- DEFAULT값인 '홍길동'과 '000-0000-0000'이 저장
728x90