gwooden_코린이

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

데이터베이스

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

gwooden22 2023. 1. 16. 09:36
728x90

1. 데이터 베이스 제약조건

  • not null
  • unique

1-1. 키본키 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');
    
-- 레코드 추가 (ID가 기본키이므로 중복내용 입력 안됨 - 오류)
INSERT INTO PK_TEST
    VALUES('A', 'ZXCV');
    
SELECT * FROM PK_TEST;

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

CREATE TABLE PR_TEST(
    ID VARCHAR(20) CONSTRAINT ID_PK PRIMARY KEY,
    PW VARCHAR(20)
);

ALTER TABLE PR_TEST
    DROP CONSTRAINT ID_PK;
    
ALTER TABLE PR_TEST
    MODIFY ID CONSTRAINT PK_ID PRIMARY KEY;
    
DROP TABLE PR_TEST;

 

1-2. 외래키 FOREIGN KEY

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

기본키를 참조

참조하는 기본키의 데이터타입과 일

 

FK_TEST 테이블에 있는 ID를 참조하는 외래키

NAME

 

CREATE TABLE FK_TEST(
    ID VARCHAR(20) CONSTRAINT FK_ID REFERENCES PK_TEST(ID),
    NAME VARCHAR(20)
);

--참조하는 PK에 B라는 데이터가 없으므로
--INSERT 안됨
INSERT INTO FK_TEST
    VALUES('B', '1234');

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


1-3. CHECK

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

CREATE TABLE CHECK_TEST(
    NAME VARCHAR(20),
    AGE NUMBER CHECK(AGE>=1 AND AGE<=100),
    GENDER VARCHAR(20) CONSTRAINT G_CHECK CHECK (GENDER IN('M', 'F'))
);

--AGE 제약조건에 위배도므로 105는 입력이 안됨 -오류
INSERT INTO CHECK_TEST
    VALUES('AA', 105, 'M');

--제약조건에 알맞게 잘 입력했으니 정상작동
INSERT INTO CHECK_TEST
    VALUES('AAA', 50, 'M');

--대소문자 구분함 -오류(오류를 없애려면 제약조건에 소문자도 같이 넣어주면 된다.)
INSERT INTO CHECK_TEST
    VALUES('AAA', 20, 'f');

SELECT * FROM CHECK_TEST;

INSERT INTO CHECK_TEST
    VALUES('B', 20, 'F');
    
--NAME은 3글자 이상만 입력되도록 제약조건을 추가
--CHECK에 맞지 않은 데이터가 존재하므로 지우고 제약조건을 걸어야됨
ALTER TABLE CHECK_TEST
    MODIFY NAME CHECK(LENGTH(NAME)>=3);
    
--제약조건을 추가하기 위해 위배되는 데이터 삭제
DELETE FROM CHECK_TEST WHERE LENGTH(NAME)<3;

SELECT * FROM CHECK_TEST;

--위배되는 데이터를 지웠으니 정상실행
ALTER TABLE CHECK_TEST
    MODIFY NAME CHECK(LENGTH(NAME)>=3);
   
--NAME이 2글자라서 추가 안됨 - 오류 
INSERT INTO CHECK_TEST
    VALUES('이름', 30, 'F');

--NAME이 3글자이상이라서 추가 잘 됨
INSERT INTO CHECK_TEST
    VALUES('김유신', 30, 'F');
VARCHAR(20) -> BYTE  최대 20BYTE까지 입력 가능
한글 -> 3BYTE 나머지는 -> 1BYTE

LENGTH로 처리 해야된다.

1-4. DEFAULT : 기본값

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

 

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


SELECT * FROM DE_TEST;

--지역을 작성해서 추가하면 입력한 지역으로 추가
INSERT INTO DE_TEST
    VALUES('고길동', '부산');

-- 지역을 NULL 추가해도 기본값이 아닌 NULL 추가
INSERT INTO DE_TEST
    VALUES('둘리', 'NULL'); 

-- 지역부분을 추가하지 않고 이름만 추가하면 지역은 기본값으로 처리
INSERT INTO DE_TEST(이름)
    VALUES('또치');

SELECT * FROM DE_TEST;

INSERT INTO DE_TEST(지역)
    VALUES('인천');

INSERT INTO DE_TEST(지역)
    VALUES('대구');

SELECT * FROM DE_TEST;


ALTER TABLE DE_TEST
    ADD CONSTRAINT DE_이름 CHECK(LENGTH(이름)>=2);
    
ALTER TABLE DE_TEST
    MODIFY 이름 DEFAULT '이름';
    
SELECT * FROM DE_TEST;

INSERT INTO DE_TEST(지역)
    VALUES('울산');
    
SELECT * FROM DE_TEST;

NOT NULL : NULL 안됨

UNIQUE : 중복 불가능

PRIMARY KEY : 기본키

FOREIGN KEY REFERENCES 참조테이블(참조컬럼) : 외래키

CHECK : 조건에 만족하는 데이터만 입력

DEFAULT : 기본값

 

CONSTRAINT 제약조건명 제약조건

 

ALTER TABLE 테이블명

                 DROP CONSTRAINT 제약조건명

 

ALTER TABLE 테이블명

                 MODIFY 컬럼명 제액조건

 

 

DEFAULT 제외

나머지 제약조건은

이미 입력도니 데이터가 제약조건에 위배되면
제약조건 추가 안됨
728x90
Comments