이 게시물은 Database GUI Oracle SQL Developer의 아래 버전 정보를 기준으로 작성되었습니다. Java(TM) 플랫폼 : 1.8.0_321 Oracle IDE : 4.1.5.21.78 |
제약 조건(CONSTRAINT) 제어, NOT NULL
설명
제약 조건(constraint) : 테이블에 저장할 데이터를 제약하는 특수한 규칙. 종류로는 NOT NULL, UNIQUE, PRIMARY KEY , FOREIGN KEY, CHECK가 있음
NOT NULL : 지정한 열에 NULL을 허용하지 않는 제약 조건. NULL을 제외한 데이터의 중복은 허용됨.
제약 조건 제어 문법
제약 조건 조회하기
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
FROM USER_CONSTRAINTS;
OWNER : 제약 조건 소유 계정
CONSTRAINT_NAME : 제약 조건 이름(지정하지 않을 경우 오라클에서 자동으로 지정)
CONSTRAINT_TYPE : 제약 조건 종류(C : CHECK, NOT NULL / U : UNIQUE / P : PRIMARY KEY / R : FOREIGN KEY)
TABLE_NAME : 제약 조건을 지정한 테이블 이름
테이블 생성 시(1)
CREATE TABLE [테이블명] (
[열이름1] [자료형1] [제약조건1(선택)],
[열이름2] [자료형2] [제약조건2(선택)],
...
[열이름n] [자료형n] [제약조건n(선택)]
);
테이블 생성 시(2) - 제약 조건의 이름을 직접 지정함
CREATE TABLE [테이블명] (
[열이름1] [자료형1] CONSTRAINT [제약조건명1(선택)] [제약조건1(선택)],
[열이름2] [자료형2] CONSTRAINT [제약조건명2(선택)] [제약조건2(선택)],
...
[열이름n] [자료형n] CONSTRAINT [제약조건명n(선택)] [제약조건n(선택)]
);
테이블 구조 수정 시
ALTER TABLE [테이블명] MODIFY([컬럼명] [제약조건]);
제약 조건 이름 변경 시
ALTER TABLE [테이블명] RENAME CONSTRAINT [기존 제약 조건 이름] TO [바꿀제약 조건 이름];
제약 조건 삭제 시
ALTER TABLE [테이블명] DROP CONSTRAINT [제약 조건 이름];
사용 예시
제약 조건 테이블 생성 및 제약 조건 조회
-- NOT NULL 제약 조건을 걸어 테이블 생성
CREATE TABLE TB_NOTNULL (
COL_IDX NUMBER(3) NOT NULL,
COL_NAME VARCHAR2(20) NOT NULL,
COL_BIRTH DATE,
TEL VARCHAR2(20)
);
DESC TB_NOTNULL;
-- 제약 조건 정보 조회
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
FROM USER_CONSTRAINTS;
-- 제약 조건 이름을 지정하여 테이블 생성
CREATE TABLE TB_NOTNULL2 (
COL_IDX NUMBER(3) CONSTRAINT TEST_CONSTRAINT1 NOT NULL,
COL_NAME VARCHAR2(20) CONSTRAINT TEST_CONSTRAINT2 NOT NULL,
COL_BIRTH DATE,
COL_TEL VARCHAR2(20)
);
-- 제약 조건 정보 조회
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
FROM USER_CONSTRAINTS;
제약 조건 테이블에 INSERT 테스트
INSERT INTO TB_NOTNULL (COL_IDX, COL_NAME, COL_BIRTH, COL_TEL)
VALUES ('101', 'KYUNGWAN', TO_DATE('1990/10/31', 'YYYY/MM/DD'), '010-1234-5678');
SELECT * FROM TB_NOTNULL;
-- COL_IDX열에 NULL 삽입
INSERT INTO TB_NOTNULL (COL_IDX, COL_NAME, COL_BIRTH, COL_TEL)
VALUES (NULL, 'KYUNGWAN', TO_DATE('1990/10/31', 'YYYY/MM/DD'), '010-1234-5678');
-- NOT NULL 제약 조건 열을 명시하지 않고 INSERT 실행
INSERT INTO TB_NOTNULL (COL_BIRTH, COL_TEL)
VALUES (TO_DATE('1990/10/31', 'YYYY/MM/DD'), '010-1234-5678');
NOT NULL 제약 조건이 걸린 열에 NULL 데이터 삽입을 유도하니 오류가 발생한다.
제약 조건 테이블에 INSERT 테스트
-- COL_BIRTH열이 NULL인 추가 데이터 삽입
INSERT INTO TB_NOTNULL (COL_IDX, COL_NAME, COL_BIRTH, COL_TEL)
VALUES ('102', 'SEOKHWAN', NULL, '010-5678-1234');
SELECT * FROM TB_NOTNULL;
-- COL_BIRTH열에 NOT NULL 제약 조건 추가
ALTER TABLE TB_NOTNULL MODIFY(COL_BIRTH NOT NULL);
COL_BIRTH열에 이미 NULL 데이터가 들어가 있으므로 NOT NULL 제약 조건이 추가되지 않음.
-- UPDATE 후 다시 시도
UPDATE TB_NOTNULL
SET COL_BIRTH = TO_DATE('1997/07/28', 'YYYY/MM/DD')
WHERE COL_NAME = 'SEOKHWAN';
SELECT * FROM TB_NOTNULL;
ALTER TABLE TB_NOTNULL MODIFY(COL_BIRTH NOT NULL);
제약 조건 추가 후 COL_BIRTH가 NULL인 데이터 INSERT를 실행
-- 제약 조건 설정 후 COL_BIRTH열이 NULL인 추가 데이터 삽입
INSERT INTO TB_NOTNULL (COL_IDX, COL_NAME, COL_BIRTH, COL_TEL)
VALUES ('103', 'HAEJUNE', NULL, '010-1111-2222');
NOT NULL 제약 조건에 의해 오류 발생
제약 조건 이름 변경
-- 제약 조건 조회
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
FROM USER_CONSTRAINTS;
맨 아래에 'SYS_C007077'인 제약 조건 이름을 변경해 보자.
(따라서 해 보는 분들은 반드시 자기 화면에 출력되는 제약 조건 이름을 사용하도록 하자)
ALTER TABLE TB_NOTNULL RENAME CONSTRAINT SYS_C007077 TO BABO
제약 조건 이름 변경
이름을 저따구로 해 놓은 걸 선임에게 들키면 죽을 수도 있으니 얼른 삭제해 보자.
ALTER TABLE TB_NOTNULL DROP CONSTRAINT BABO;
'개발 지식 > [DBMS] Oracle' 카테고리의 다른 글
[Oracle] 제약 조건(3) - 기본 키(PRIMARY KEY) (0) | 2022.06.25 |
---|---|
[Oracle] 제약 조건(2) - UNIQUE (0) | 2022.06.24 |
[Oracle] DDL(8) - 시퀀스(SEQUENCE) (0) | 2022.06.22 |
[Oracle] DDL(7) - 시노님(SYNONYM) (0) | 2022.06.21 |
[Oracle] DDL(6) - 뷰(VIEW) (0) | 2022.06.20 |