개발자꿈나무

제약 조건 본문

SQL

제약 조건

망재이 2023. 2. 14. 23:00
  1. NOT NULL : NULL 허용하지 않음, NULL을 제외한 데이터 중복은 허용
  2. UNIQUE : 지정한 열이 유일한 값을 가져야함. 중복 불가. NULL은 중복 가능
  3. PRIMARY KEY : 유일한 값이면서 NULL 허용하지 않음, 테이블에 하나만 지정 가능
  4. FOREIGN KEY : 다른 테이블의 열을 참조하여 존재하는 값만 입력 가능
  5. 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

'SQL' 카테고리의 다른 글

옵티마이저  (0) 2023.02.26
시스템 권한 부여 방법  (0) 2023.02.14
동의어  (0) 2023.02.14
시퀀스  (0) 2023.02.14
  (0) 2023.02.14