------------------------------------------------------------------------
--■■■ 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;
'📚Study Note > ORACLE' 카테고리의 다른 글
[ ORACLE ] UPDATE : 테이블에서 기존 데이터를 변경 + 업데이트 실수를 백업테이블로 다시 수정하기 (0) | 2021.04.07 |
---|---|
[ ORACLE ] DEFAULT 표현식 (0) | 2021.04.07 |
[ ORACLE ] FOREIGN KEY(FK : F: R) (0) | 2021.04.07 |
[ ORACLE ] CHECK(CK : C) (0) | 2021.04.06 |
[ ORACLE ] 무결성(Intergrity) │ PRIMARY KEY │ UNIQUE (0) | 2021.04.06 |