본문 바로가기

📚Study Note/ORACLE

[ ORACLE ] NOT NULL(NN:CK:C)

------------------------------------------------------------------------


--■■■  NOT NULL(NN:CK:C) ■■■

-- 1. 테이블에서 지정한 컬럼의 데이터가 NULL을 갖지 못하도록 하는 제약조건

2. 형식 및 구조
① 컬럼 레벨의 형식
컬럼명 데이터타입 [CONSTRAINT CONSTRAINT명] NOT NULL

② 테이블 레벨의 형식
컬럼명 데이터타입
컬럼명 데이터타입
CONSTRAINT CONSTRAINT명 CHECK(컬럼명 IS NOT NULL)

3. 기존에 생성되어 있는 테이블에 NOT NULL 제약조건을 추가할 경우
ADD 보다 MODIFY 절이 더 많이 사용된다.

ALTER TABLE 테이블명
MODIFY 컬럼명 데이터타입 NOT NULL;

4. 기존 테이블에 데이터가 이미 들어있지 않은 컬럼(→ NULL 인 상태)을
NOT NULL 제약조건을 갖게끔 수정하는 경우에는 에러 발생한다.

--● NOT NULL 지정 실습( 컬럼 레벨의 형식 )

CREATE TABLE TBL_TEST11
(COL1   NUMBER(5) PRIMARY KEY

,COL2   VARCHAR2(30) NOT NULL);

--==>>Table TBL_TEST11이(가) 생성되었습니다.


INSERT INTO TBL_TEST11(COL1,COL2) VALUES (1,'TEST');
INSERT INTO TBL_TEST11(COL1,COL2) VALUES (2,'ABCD');
INSERT INTO TBL_TEST11(COL1,COL2) VALUES (3,'NULL');
INSERT INTO TBL_TEST11(COL1,COL2) VALUES (4,NULL);
INSERT INTO TBL_TEST11(COL1) VALUES (5);


SELECT *
FROM TBL_TEST11;

/*
1	TEST
2	ABCD
3	NULL*/

COMMIT;

-- 제약조건 확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME='TBL_TEST11';

/*
HR	SYS_C007137	TBL_TEST11	C	COL2	"COL2" IS NOT NULL	
HR	SYS_C007138	TBL_TEST11	P	COL1		
*/

-- NOT NULL 지정 실습 (테이블 레벨의 형식)

-- 테이블 생성
CREATE TABLE TBL_TEST12
(COL1 NUMBER(5)
, COL2 VARCHAR2(30)
, CONSTRAINT TEST12_COL1_PK PRIMARY KEY(COL1)
,CONSTRAINT TEST12_COL2_NN CHECK (COL2 IS NOT NULL)

);

--==>>Table TBL_TEST12이(가) 생성되었습니다.

-- 제약조건 확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME='TBL_TEST12';
/*
HR	TEST12_COL2_NN	TBL_TEST12	C	COL2	COL2 IS NOT NULL	
HR	TEST12_COL1_PK	TBL_TEST12	P	COL1		*/

-- ● NOT NULL 지정 실습(테이블 생성 이후 제약조건 추가 NN 제약조건 추가)

CREATE TABLE TBL_TEST13
(COL1   NUMBER(5)
,COL2  VARCHAR2(30)
);


-- 제약 조건 추가
ALTER TABLE TBL_TEST13
ADD( CONSTRAINT TEST13_COL1_PK PRIMARY KEY(COL1)
    , CONSTRAINT TEST13_COL2_NN CHECK(COL2 IS NOT NULL)


);


SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME='TBL_TEST13';
/*
HR	TEST13_COL1_PK	TBL_TEST13	P	COL1		
HR	TEST13_COL2_NN	TBL_TEST13	C	COL2	COL2 IS NOT NULL	
*/

-- ※ NOT NULL 제약조건만 추가하는 경우 다음과 같은 방법도 가능하다. 

-- 테이블생성
CREATE TABLE TBL_TEST14
( COL1  NUMBER(5)
, COL2  VARCHAR2(30)
, CONSTRAINT TEST14_COL1_PK PRIMARY KEY(COL1)


);


-- NOT NULL 제약조건 추가

ALTER TABLE TBL_TEST14
MODIFY COL2 NOT NULL;

--===>>Table TBL_TEST14이(가) 변경되었습니다.


NOT NULL 은 컬럼 레벨에서 지정하기를 권장한다, 그 이유는
??


-- ※ 컬럼 레벨에서 지정한 테이블 
DESC TBL_TEST11;
/*
이름   널?       유형           
---- -------- ------------ 
COL1 NOT NULL NUMBER(5)    
COL2 NOT NULL VARCHAR2(30) 
*/

-- ※ 테이블 레벨에서 낫널 제약조건을 제정한 테이블
DESC TBL_TEST12;
/*
이름   널?       유형           
---- -------- ------------ 
COL1 NOT NULL NUMBER(5)    
COL2          VARCHAR2(30) 

*/

비교해보면 아래는 COL2 에 NOT NULL 이 없다.

--> DESC 를 통해 COL2 컬럼이 NOT NULL 인 정보가 확인되는 상황
-- 아 꼭 DESC에 NOT NULL 이 아니더라도 제약조건이 걸ㄹ려있으면 널이 못들어가는구나


-- ※ 테이블 생성 이후 ADD를 통해 NOT NULL제약조건을 추가한 테이블
DESC TBL_TEST13;
/*
이름   널?       유형           
---- -------- ------------ 
COL1 NOT NULL NUMBER(5)    
COL2          VARCHAR2(30
*/

-- 이것 또한 마찬가지로 확인되지가 않는다. 

-- ※ 테이블 생성 이후 MODIFY를 통해 NOT NULL제약조건을 추가한 테이블
DESC TBL_TEST14;
/*
이름   널?       유형           
---- -------- ------------ 
COL1 NOT NULL NUMBER(5)    
COL2 NOT NULL VARCHAR2(30)

*/

--NOT NULL 조건은 컬럼 레벨에서 생성하고 이미 테이블이 만들어져있다면 MODIFY 절로 하도록!

주의 할 점은 NOT NULL 제약조건을 테이블 레벨에서 생성할 시 DESC 에서 NOT NULL이 보이지 않는 문제가 생긴다. 따라서 컬럼 레벨에서 

 

① 컬럼 레벨의 형식
컬럼명 데이터타입 [CONSTRAINT CONSTRAINT명] NOT NULL 

 

로 지정해주거나 

테이블이 이미 생성되어 있다면 MODIFY를 통해 NOT NULL 제약조건을 추가해줘야 한다. 

 

ALTER TABLE TBL_TEST14

MODIFY COL2 NOT NULL;