본문 바로가기

📚Study Note/ORACLE

[ ORACLE ] CHECK(CK : C)

■■■  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) );