gwooden_코린이

오라클 데이터 베이스 제약조건 본문

데이터베이스

오라클 데이터 베이스 제약조건

gwooden22 2023. 1. 13. 16:31
728x90

1. 데이터 제약 조건

  • 데이터에 제약조건을 걸어서 옳지않은 데이터가 입력되는걸 방지
  • 데이터의 무결성을 유지하기 위함

 

- 무결성이란?

데이터의 정확성, 일관성을 보장

 

  • 영역 무결성 :
    • 컬럼에 저장되는 데이터가 적정 데이터인지 확인   NULL, 조건범위에 해당하는 값 만족하는 데이터
  • 참조 무결성 :
    • 기본키를 참조하는 외래키에는 기본키에 해당하는 데이터만 저장
  • 개체 무결성 : 
    • 데이터를 유일하게 식별해주는 기본키는 반드시 값이 있어야 하고, NULL 안되고, 중복도 불가능

- NOT NULL(NULL 안됨)

INSERT 말고도 제약 조건을 걸 수 있다.

 

테이블 생성

CREATE TABLE 테이블명 (

     컬럼명 데이터형식 NOT NULL --오라클이 알아서 제약조건이름 설정

     컬럼명 데이터형식 CONSTRAINT 제약조건명 NOT NULL

);

제약조건 삭제

데이터가 있던 말 던 그냥 됨

 

ALTER TABLE 테이블 이름

           DROP CONSTRAINT 제약조건명

 

이미 생성된 테이블에 제약조건을 추가

데이터가 없으면 괜찮음

데이터가 있을 경우에는 제약조건을 위배되는 데이터가 있으면 안됨)

 

ALTER TABLE 테이블명

      MODIFY 컬럼명 NOT NULL; --제약조건이름은 오라클이 알아서 해줌

 

CREATE TABLE NULL_TEST (
    ID VARCHAR(20) NOT NULL,
    PW VARCHAR(20) NOT NULL,
    NAME VARCHAR(20) 
);


INSERT INTO NULL_TEST
    VALUES('AAAA', '1234', '고길동');
    
--테이블 생성에서 NULL은 안된다고 제약을 걸어서 오류 발생
INSERT INTO NULL_TEST
    VALUES(NULL, 'ABCD', '홍홍홍');
    
--테이블 생성시 NAME 컬럼(세번째 컬럼)은 따로 제약조건을 걸지 않아 NULL 값이 입력된다.
INSERT INTO NULL_TEST
    VALUES('BBBB', '1234', 'NULL');

1-1. NOT NULL

 

CREATE TABLE 테이블 (
    ID VARCHAR(50) CONSTRAINT 제약조건 이름 NOT NULL
);

 

DROP TABLE NULL_TEST;

CREATE TABLE NULL_TEST(
    ID VARCHAR(50) NOT NULL, -- 제약조건 이름은 오라클이 자동으로 설정
    PW VARCHAR(50) CONSTRAINT PW_NULL NOT NULL, -- 제약조건 이름은 PW_NULL
    NAME VARCHAR(50) -- 제약조건 없음
);

-- 제약조건에 위배되는 데이터가 없으므로 잘 실행 됨
INSERT INTO NULL_TEST
    VALUES('AAA', '1234', NULL ); 
-- ID에 설정된 제약조건에 위배되므로 실행이 안됨
INSERT INTO NULL_TEST
    VALUES(NULL, '1234', '홍길동'); 
-- PW에 설정된 제약조건에 위배되므로 실행이 안됨
INSERT INTO NULL_TEST
    VALUES('BBB', '', '홍길동');
    
-- 이미 생성된 테이블안에 제약조건 추가
-- 이미 입력된 데이터 중 NAME에 NULL이 존재하므로 제약조건 추가 불가능
ALTER TABLE NULL_TEST
    MODIFY NAME NOT NULL; -- 제약조건 이름은 오라클이 자동으로 설정
    --참고사항
ALTER TABLE NULL_TEST    
    MODIFY NAME CONSTRAINT NAME_NULL NOT NULL; -- 제약조건이름은 NAME_NULL로 설정
    
-- 확인해보면 NAME에 NULL이 있어서 위에 코드가 실행 안됨
SELECT * FROM NULL_TEST;
    
-- NAME에 NOT NULL을 추가하기 위해선 기존 입력된 데이터 중 NULL인걸 삭제해야함
-- 그래서 NAME이 NULL인 데이터를 삭제함
DELETE FROM NULL_TEST WHERE NAME IS NULL;
    
-- 삭제 후 제약조건을 추가하면 잘 추가 됨
ALTER TABLE NULL_TEST    
    MODIFY NAME CONSTRAINT NAME_NULL NOT NULL; -- 제약조건 이름은 NAME_NULL임
    
-- 제약조건 잘 추가 된지 확인 (실행이 안되면 잘 추가 된거임)
INSERT INTO NULL_TEST
    VALUES('AA', '11', NULL);
    
-- 현재 3개의 컬럼에 모두 NOT NULL 설정이 되어있으므로 추가는 무조건 다 입력해줘야함
INSERT INTO NULL_TEST
    VALUES('AA', '11', '홍길동');
    
-- 위 INSERT 잘 추가된건지 확인
SELECT * FROM NULL_TEST;
    
-- 생각해보니 NAME에는 NOT NULL일 필요가 없을거 같음
-- 그래서 제약조건 삭제시킬거임
ALTER TABLE NULL_TEST
    DROP CONSTRAINT NAME_NULL; -- 제약조건이름이 NAME_NULL인거 삭제
    
-- 위에서 NAME제약조건을 지웠으므로 이제 NULL이 추가됨
INSERT INTO NULL_TEST
    VALUES('BB', '123', NULL);

-- NULL추가 된건지 최종확인
SELECT * FROM NULL_TEST;

 


 

1-2. UNIQUE

제약조건이름 설정하는 NOT NULL과 방식이 같음
-> CONSTRAINT 제약조건이름 설정할제약조

CREATE TABLE UNIQUE_TEST(
    ID VARCHAR(20) UNIQUE, --중복 불가능
    PW VARCHAR(20)
);

--단순 내용추가
INSERT INTO UNIQUE_TEST
    VALUES('A', '1111');
    
--ID가 중복되는 데이터를 추가
INSERT INTO UNIQUE_TEST
    VALUES('A', '2222'); --실행 안되는게 정상(이미 존재하는 ID라 중복에서 걸림)
    
--UNIQUE는 NULL 가능
INSERT INTO UNIQUE_TEST
    VALUES(NULL, '3333');
    
--NULL추가된거 확인
SELECT * FROM UNIQUE_TEST;

--또 INSERT로 NULL을 추가하면??
INSERT INTO UNIQUE_TEST
    VALUES(NULL, '4444');

--확인해보니 NULL이 한번 더 추가가 되었다. 그 이유로는 NULL은 값이 따로 없어서
--UNIQUE하고는 상관이 없다
SELECT * FROM UNIQUE_TEST;


--단순 데이터 추가(기존에 입력된 PW와 겹치는걸로 넣어서 테스트해보기)
INSERT INTO UNIQUE_TEST
    VALUES('B', '1111');
    
--데이터 추가 확인
SELECT * FROM UNIQUE_TEST;
--A	    1111
--NULL	3333
--NULL	4444
--B	    1111

--PW 제약조건 (UNIQUE) 추가
--이미 입력된 데이터 중에 PW가 중복되는것이 존재해서 안됨
ALTER TABLE UNIQUE_TEST
    MODIFY PW UNIQUE;
    
--중복되는 데이터를 지우기
DELETE FROM UNIQUE_TEST WHERE ID = 'B';

--지우고 데이터 지우고 다시 제약조건 추가해보기
--중복되는 데이터가 없어 정상 실행 됨
ALTER TABLE UNIQUE_TEST
    MODIFY PW UNIQUE;
    
--제약 조건이 잘 걸렸는지 확인해보기
--기존 PW 입력된거랑 중복되는걸 추가시켜서 실행해 봄
--실행 안되면 제약조건이 잘 적용된것
INSERT INTO UNIQUE_TEST
    VALUES('B', '1111');
    
--생각해보니 PW는 중복되고 괜찮은거 같음
--그래서 PW의 제약조건을 삭제
ALTER TABLE UNIQUE_TEST
    DROP CONSTRAINT SYS_C007023; --제약조건 이름을 모르다 보니 테이블에서 직접 확인
    
--제약조건 삭제했으니 중복데이터 추가해보기
INSERT INTO UNIQUE_TEST
    VALUES('B', '1111');

SELECT * FROM UNIQUE_TEST;
--A	    1111
--NULL	3333
--NULL	4444
--B	    1111

 

728x90
Comments