스퐁지송 개발노트

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

DATABASE

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

강준석 2023. 1. 13. 18:10
728x90

제약조건

데이터에 제약조건을 걸어서 옮지않은 데이터가 입력되는걸 방지

데이터의 무결성을 유지하기 위함

 

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

영역 무결성 - 컬럼에 저장되는 데이터가 적정 데이터인지 확인
                      NULL,조건범위에 해당하는 값 만족하는 데이터


참조 무결성 - 기본키를 참조하는 외래키에는 기본키에 해당하는 데이터만 저장


개체 무결성 - 데이터를 유일하게 식별해주는 기본키는 반드시 값이 있어야하고,

                      NULL 안되고, 중복도 불가능하다

 

 

NOT NULL (데이터추가 NULL불가능)

CREATE TABLE NULL_TEST (
    ID VARCHAR(20) NOT NULL, --NULL 안됨
    PW VARCHAR(20) NOT NULL, --NULL 안됨
    NAME VARCHAR(20)
);
SELECT * FROM NULL_TEST;

INSERT INTO NULL_TEST
    VALUES('TEEMO','1234','캡틴티모');
    
INSERT INTO NULL_TEST
    VALUES (NULL,'1234','티모'); 
    -- ID부분이 NULL 이기때문에 실행안됨
    
INSERT INTO NULL_TEST
    VALUES('TEEMO','1234',NULL);
    --NAME 부분은 NOT NULL 처리를 하지않아 정상적으로 추가됨
    
UPDATE NULL_TEST SET ID = NULL;
    --정보 수정도 NULL로 불가능

 

CONSTRAINT

: 제약조건 직접 입력

CONSTRAINT 제약조건이름(본인이 아무거나 설정) 설정할제약조건

 

기본형식

테이블 생성
CREATE TABLE 테이블명 (
	컬럼명 데이터형식 NOT NULL --오라클이 알아서 제약조건이름을 설정
    컬럼명 데이터형식 CONSTRAINT 제약조건명 NOT NULL
    );

제약조건 삭제
ALTER TABLE 테이블명 
	DROP CONSTRANINT 제약조건
    
이미 생성된 테이블에 제약조건을 추가
(데이터가 없으면 괜찮으나 추가할 제약조건에 위배되는 데이터가 있으면 불가능)->데이터삭제로 해결해야함
ALTER TABLE 테이블명
	MODIFY 컬럼명 NOT NULL; --제약조건이름은 오라클이 알아서 지정

CONSTRAINT으로 지정해준 NOT NULL 속성을 가진 ID_NULL 제약조건

(제약조건걸린 테이블 생성)
CREATE TABLE NULL_TEST2(
    ID VARCHAR(20) CONSTRAINT ID_NULL NOT NULL,
    --제약조건 직접입력 ID_NULL은 뒤에 적힌 제약조건의 속성을 가지게된다
    PW VARCHAR(20)
);

(테이블에 제약조건에 위배되지않는 데이터 넣기)
INSERT INTO NULL_TEST2
    VALUES('TEEMO',NULL);
    --PW에는 NOT NULL 처리를 하지않아 추가됨

(PW컬럼에 추가로 제약조건 걸기)
ALTER TABLE NULL_TEST2
    MODIFY PW NOT NULL;
    --PW에 NOT NULL 데이터 추가 하지만 이미 VALUES('TEEMO',NULL); 값이 있어 추가안됨
    
(제약조건이 안걸리는 이유 : 제약조건에 위배되는 데이터가 있으므로 해결해야함)
DELETE FROM NULL_TEST2; --그래서 데이터 모두 삭제
    --데이터 모두 삭제후 
ALTER TABLE NULL_TEST2
    MODIFY PW NOT NULL;
    --실행시 정상적으로 제약조건 걸림
    
    
ALTER TABLE NULL_TEST2
	DROP CONSTRAINT ID_NULL;
    --아까 직접작성한 ID_NULL 제약조건을 지움
    
INSERT INTO NULL_TEST2
	VALUES(NULL,'1234');
    -- ID에 걸린 NOT NULL 속성의 ID_NULL의 제약조건이 사라져서 정상작동
    
 DELETE FROM NULL_TEST2 WHERE 위배되는 컬럼을 지정;
 --이렇게 지우면 모든 데이터를 지우지않아도 된다

 

 

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('캡틴티모','1234',NULL);
    
--ID에 설정된 제약조건에 위배되므로 실행이 안됨
INSERT INTO NULL_TEST
    VALUES(NULL,'1234','티모');
    
--PW에 설정된 제약조건이 위배되므로 실행이 안됨
INSERT INTO NULL_TEST
    VALUES('캡틴티모',NULL,'티모');
    
--이미 생성된 테이블안에 제약조건 추가
--이미 입력된 데이터 중 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('캡틴티모','1212',NULL);
    
--현재 3개의 컬럼에 모두 NOT NULL 설정이 되어있으므로 추가는 무족건 다 입력해야함
--(잘실행되어야함)
INSERT INTO NULL_TEST
    VALUES('캡틴티모','1234','TEEMO');

--생각해보니 NAME에는 NOT NULL일 필요가 없을거 같음
--그래서 제약조건 삭제시킬거임
ALTER TABLE NULL_TEST
    DROP CONSTRAINT NAME_NULL; --제약조건 이름이 NAME_NULL인것을 삭제

--위에 NAME제약조건을 지웠으므로 이제 이름에 NULL이 추가됨
INSERT INTO NULL_TEST
    VALUES('캡틴티모','1234',NULL);

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

ROLLBACK;

 


UNIQUE

:중복 불가능

 

기본형식

CREATE TABLE UNIQUE_TEST(
    ID VARCHAR(20) UNIQUE,
    PW VARCHAR(20)
);

돌아가는 과정

--UNIQUE : 중복 불가능

CREATE TABLE UNIQUE_TEST(
    ID VARCHAR(20) UNIQUE,
    PW VARCHAR(20)
);
--데이터 추가
INSERT INTO UNIQUE_TEST
    VALUES('마이','1111');

--ID가 중복되는 데이터를 추가하려함 (안되는게 정상)
INSERT INTO UNIQUE_TEST
    VALUES('마이','2222'); --제약조선(중복불가능)UNIQUE를 ID에 설정했기때문

--UNIQUE는 NULL 가능
INSERT INTO UNIQUE_TEST
    VALUES(NULL,'3333');

--NULL이 추가된거 확인
SELECT * FROM UNIQUE_TEST;

--근데 NULL데이터 ID를 추가하면???
INSERT INTO UNIQUE_TEST
    VALUES(NULL,'4444');
--확인해보면 중복으로 들어감
SELECT * FROM UNIQUE_TEST;
--이유: NULL은 값이 없다는 뜻이므로 UNIQUE랑은 상관이 없음.

--걍 데이터 추가함 (기존에 입력된 PW와 겹치는걸로 넣음)
INSERT INTO unique_test
    VALUES('애쉬','1111');
--데이터 추가된거 확인
SELECT * FROM UNIQUE_TEST;

--PW에 제약조건(UNIQUE)를 추가
--(PW가 이미 중복된 데이터가 있으므로 실행안됨)
ALTER TABLE UNIQUE_TEST
    MODIFY PW UNIQUE;
    
--중복되는 데이터를 지움
DELETE FROM UNIQUE_TEST WHERE ID = '마이';

--중복된 데이터를 지웠고 다시 제약조건을 추가해봄
--중복된 PW 데이터가 없으므로 잘 실행됨
ALTER TABLE UNIQUE_TEST
    MODIFY PW UNIQUE;
    
 --PW에 제약조건이 잘 설정된지 확인
 --기존 PW와 중복된 데이터를 추가(실행이 안되면 정상)
INSERT INTO UNIQUE_TEST
    VALUES('베인','1111');
    
--생각해보니 PW는 중복되도 괜찮은거같음
--PW의 제약조건을 삭제시키기
ALTER TABLE UNIQUE_TEST
    DROP CONSTRAINT SYS_C007015; --제약조건이름을 설정하지않아 모름
--UNIQUE_TEST 테이블을 열어 제약조건의 이름을 찾으면됨(SYS_C007015)

--제약조건 삭제했으니 중복데이터 추가시켜봄(작동되면 정상)
INSERT INTO UNIQUE_TEST
    VALUES('베인','1111');

--중복데이터 추가 잘된지 확인
SELECT * FROM UNIQUE_TEST;

 


PRIMARY KEY

: 각 레코들을 구별해주는 필드, 중복내용 입력 불가능, NULL 불가능

 

create table pk_test(   
    id varchar(20) primary key,
    pw varchar(20)
    );
    
desc pk_test;

insert into pk_test
    values('a','1234');
    
insert into pk_test
    values('a','zxcv');
    
select*from pk_test2;

--레코드 추가(ID가 기본키으므로 NULL안됨 - 오류)
INSERT INTO PK_TEST
    VALUES(NULL,'1234');

 


외래키 FOREIGN KEY

 : 다른 테이블간 관계를 정의할 떄 사용

기본키를 참조

참조하는 기본키의 데이터타입과 일치해야함

--
create table pk_test(   
    id varchar(20) primary key,
    pw varchar(20)
    );
    
 
 CREATE TABLE FK_TEST
    ID NUMBER CONSTRAINT FK_ID REFERENCES PK_TEST(ID),
    NAME VARCHAR(20)
);

PK_TEST의 ID컬럼의 데이터 타입과
KF_TST의 ID컬럼의 데이터 타입이 다르게 생성 불가

 

INSERT INTO FK_TEST
    VALUES('B','123');
    
--오류가남
--참조하는 PK에 B라는 데이터가 없으므로 INSERT불가능
--PK테이블을 참조하기 때문에 PK에 있는 데이터로 생성할 수 있다

INSERT INTO FK_TEST
    VALUES('a','홍길동');
--참조하는 PK컬럼(ID)에 a가 있으므로 잘 추가가 됨

 

실사용예제

 

CHECK

직접 조건을 지정해서 조건에 만족하는 데이터만 입력

 

DEFAULT

: 데이터를 입력하지 않을 경우 자동으로 입력되는 값을 기본값이라고 함

CREATE TABLE DE_TEST(
    이름 VARCHAR(50),
    지역 VARCHAR(50) DEFAULT '서울'
  --지역 VARCHAR(50) DEFAULT '서울' CONSTRAINT 제약조건이름 DEFAULT '서울'
);


-EX)

 --지역을 작성해서 추가하면 입력한 지역으로 추가
INSERT INTO DE_TEST
    VALUES('티모', '부산');
    --지역을 NULL로 추가해도 기본값이 아닌 NULL로 추가
INSERT INTO DE_TEST
    VALUES('베인', NULL);
    --지역부분을 추가하지 않고 이름만 추가하면 지역은 기본값으로 처리
INSERT INTO DE_TEST(이름)
    VALUES('애쉬');
INSERT INTO DE_TEST(지역)
    VALUES('인천');
INSERT INTO DE_TEST(지역)
    VALUES('대구');
SELECT * FROM DE_TEST;

    --제약조건추가
ALTER TABLE DE_TEST
    MODIFY 이름 DEFAULT '이름';
    --이미 입력된 데이터는 적용안됨
SELECT * FROM DE_TEST;
    --데이터 추가
INSERT INTO DE_TEST(지역)
    VALUES('울산');
    --추가된 제약조건이 걸림
SELECT * FROM DE_TEST;


정리

모든 제약조건의 형식

DEFAULT 제외 

나머지 제약조건은

이미 입력된 데이터가 제약조건에 위배되면 제약조건 추가 안됨\

 

728x90
Comments