■■■ CHECK (CK:C) ■■■
1. 컬럼에서 허용 가능한 데이터의 범위나 조건을 지정하기 위한 제약조건
컬럼에 입력되는 데이터를 검사하여 조건에 맞는 데이터만 입력될 수 있도록
처리하며 수정되는 데이터 또한 검사하여 조건에 맞는 데이터로 수정되는 것만 허용하는 기능을 수행하게 된다.
2. 형식 및 구조
① 컬럼 레벨의 형식
컬럼명 데이터타입[CONSTRAINT CONSTRAINT명] CHECK (컬럼조건)
② 테이블 레벨의 형식
컬럼명 데이터타입,
컬럼명 데이터타입,
CONSTRAINT CONSTRAINT명 CHECK(컬럼조건)
※ 각 데이터 타입의 최대크기
NUNMBER(38)
CHAR(2000)
VARCHAR2(4000)
NCHAR(1000)
NVARCHAR2(2000) 까지... 유니코드 기반으로 가면서 반으로 줄어든다
이거는 NUMBER(9999999999999999999999999)해보면 오류뜨면서 가능범위 알려준다.
만약 이렇게 쓴다면 ▶ 이렇게 설정된다. (넘버타입은 최대크기로 , 차타입은 1 로)
COL1 NUMBER ▶ NUMBER(38)
COL2 CHAR ▶ CHAR(1)
-- ● CK 지정 실습( ① 컬럼 레벨의 형식 )
-- 테이블 생성
CREATE TABLE TBL_TEST8
(COL1 NUMBER(5) PRIMARY KEY
, COL2 VARCHAR2(30)
, COL3 NUMBER(3) CHECK (COL3 BETWEEN 0 AND 100)
);
--==> Table TBL_TEST8이(가) 생성되었습니다.
--데이터 입력
INSERT INTO TBL_TEST8(COL1,COL2,COL3) VALUES(1,'가영',100);
INSERT INTO TBL_TEST8(COL1,COL2,COL3) VALUES(2,'혜림',101);--==>> 에러발생
INSERT INTO TBL_TEST8(COL1,COL2,COL3) VALUES(3,'서현',-1);--==>>에러발생
INSERT INTO TBL_TEST8(COL1,COL2,COL3) VALUES(4,'정준',80);
COMMIT;
--==>>커밋 완료.
SELECT *
FROM TBL_TEST8;
/*
1 가영 100
4 정준 80
*/
-- ● 제약 조건 확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME='TBL_TEST8';
/*
HR SYS_C007121 TBL_TEST8 C COL3 COL3 BETWEEN 0 AND 100
HR SYS_C007122 TBL_TEST8 P COL1
*/
--● CK 지정 실습(② 테이블 레벨의 형식)
-- 테이블 생성
CREATE TABLE TBL_TEST9
(COL1 NUMBER(5)
, COL2 VARCHAR2(30)
, COL3 NUMBER(3)
, CONSTRAINT TEST9_COL1_PK PRIMARY KEY(COL1)
, CONSTRAINT TEST9_COL2_CK CHECK(COL3 BETWEEN 0 AND 100 )
);
--==>>Table TBL_TEST9이(가) 생성되었습니다.
INSERT INTO TBL_TEST9(COL1,COL2,COL3) VALUES(1,'가영',100);
INSERT INTO TBL_TEST9(COL1,COL2,COL3) VALUES(2,'혜림',101);--==>> 에러발생
INSERT INTO TBL_TEST9(COL1,COL2,COL3) VALUES(3,'서현',-1);--==>>에러발생
INSERT INTO TBL_TEST9(COL1,COL2,COL3) VALUES(4,'정준',80);
-- ● 제약조건 확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME='TBL_TEST9';
/*
HR TEST9_COL2_CK TBL_TEST9 C COL3 "COL3 BETWEEN 0 AND 100 "
HR TEST9_COL1_PK TBL_TEST9 P COL1
*/
-- ● CK 지정 실습 ( ③ 테이블 생성 이후 제약조건 추가 → CK 제약조건 추가 )
-- 테이블 생성
CREATE TABLE TBL_TEST10
(COL1 NUMBER(5)
, COL2 VARCHAR2(30)
, COL3 NUMBER(3)
);
--==>>Table TBL_TEST10이(가) 생성되었습니다.
-- 제약조건 확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME='TBL_TEST10';
--==>> 조회결과 없음
-- 기존 테이블에 제약 조건 추가
ALTER TABLE TBL_TEST10
ADD ( CONSTRAINT TEST10_COL1_PK PRIMARY KEY(COL1)
, CONSTRAINT TEST10_COL3_CK CHECK(COL3 BETWEEN 0 AND 100) );
--==>>Table TBL_TEST10이(가) 변경되었습니다.
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME='TBL_TEST10';
/*
HR TEST10_COL1_PK TBL_TEST10 P COL1
HR TEST10_COL3_CK TBL_TEST10 C COL3 COL3 BETWEEN 0 AND 100
*/
-- ● 실습 문제
-- 다음과 같이 TBL_TESTMEMBER 테이블을 생성하여 SSN컬럼(주민번호 컬럼)에서 데이터 입력 시
-- 성별이 유효한 데이터만 입력될 수 있도록 체크 제약조건을 추가할 수 있도록 한다.
-- 주민번호 특정 자리에 입력 가능한 데이터로 1234를 적용
-- 또한 SID 컬럼에는 PRIMARY KEY 제약조건을 설정할 수 있도록 한다.
CREATE TABLE TBL_TESTMEMBER
( SID NUMBER
, NAME VARCHAR(30)
, SSN CHAR(14) -- 입력형태 'YYMMDD-NNNNNNN'
, TEL VARCHAR2(40)
);
--==>Table TBL_TESTMEMBER이(가) 생성되었습니다.
ALTER TABLE TBL_TESTMEMBER
ADD (CONSTRAINT TESTMEMBER_SID_PK PRIMARY KEY(SID));
--==>>Table TBL_TESTMEMBER이(가) 변경되었습니다.
-- 여기서 좀 막힘. (괄호잘못써서 막힌 거였음)
ALTER TABLE TBL_TESTMEMBER
ADD (CONSTRAINT TESTMEMBER_SSN_CK CHECK(SUBSTR(SSN,8,1) IN ('1','2','3','4'))) -- 여기서 문자 BETWEEN 도 된다?
;
-- 제약 조건 확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME = 'TBL_TESTMEMBER';
/*
HR TESTMEMBER_SID_PK TBL_TESTMEMBER P SID
HR TESTMEMBER_SSN_CK TBL_TESTMEMBER C SSN SUBSTR(SSN,8,1) IN ('1','2','3','4') */
-- 제약조건 부여 후 데이터 입력 확인
INSERT INTO TBL_TESTMEMBER(SID,NAME,SSN,TEL) VALUES(1,'깐깐찡어','990066-7128363','010-0000-0000');
--==>>에러발생(주민번호)
INSERT INTO TBL_TESTMEMBER(SID,NAME,SSN,TEL) VALUES(1,'깐깐찡어','990066-2128363','010-0000-0000');
INSERT INTO TBL_TESTMEMBER(SID,NAME,SSN,TEL) VALUES(2,'깐깐찡어','990066-1128363','010-0000-0000');
SELECT *
FROM TBL_TESTMEMBER
ORDER BY SID;
/*
1 깐깐찡어 990066-2128363 010-0000-0000
2 깐깐찡어 990066-1128363 010-0000-0000
*/
-------------------------------------------------------------------------------------
CREATE TABLE TBL_TEST8
( COL1 NUMBER(5) PRIMARY KEY
, COL2 VARCHAR2(30)
, COL3 NUMBER(3) CHECK (COL3 BETWEEN 0 AND 100)
);
CREATE TABLE TBL_TEST9
( COL1 NUMBER(5)
, COL2 VARCHAR2(30)
, COL3 NUMBER(3)
, CONSTRAINT TEST9_COL1_PK PRIMARY KEY(COL1)
, CONSTRAINT TEST9_COL2_CK CHECK(COL3 BETWEEN 0 AND 100 )
);
ALTER TABLE TBL_TEST10
ADD ( CONSTRAINT TEST10_COL1_PK PRIMARY KEY(COL1)
, CONSTRAINT TEST10_COL3_CK CHECK(COL3 BETWEEN 0 AND 100) );
'📚Study Note > ORACLE' 카테고리의 다른 글
[ ORACLE ] NOT NULL(NN:CK:C) (0) | 2021.04.07 |
---|---|
[ ORACLE ] FOREIGN KEY(FK : F: R) (0) | 2021.04.07 |
[ ORACLE ] 무결성(Intergrity) │ PRIMARY KEY │ UNIQUE (0) | 2021.04.06 |
[ ORACLE ] 테이블 생성 시 주의할 점 관계/속성/튜플(엔티티)/도메인/릴레이션 (0) | 2021.04.06 |
[ ORACLE ] 제 2 정규화 제 3 정규화 제 4 정규화 역정규화 (0) | 2021.04.05 |