DB의 구조를 생성하거나 수정 및 삭제하는데 사용되는 SQL문이다.
DDL은 자동으로 COMMIT되기 때문에 DB에 즉각 영향을 미치며 DB Dictionary에 정보가 저장된다.
오라클 객체
|객체명|설명|
|-|-|
|테이블(table)|기본적인 데이터 저장 단위로 행과 열로 구성된 객체|
|인덱스(index)|테이블에 저장된 데이터의 검색 성능 향상 목적을 위한 객체|
|뷰(view)|한 개 이상의 테이블의 논리적인 부분 집합을 표시할 수 있는 객체|
|시퀀스(sequence)|테이블의 특정 컬럼 값에 숫자 값 자동 생성 목적을 위한 객체|
|동의어(synonym)|객체에 대한 동의어를 설정하기 위한 객체|
SQL 종류 | 명령문 |
---|---|
Data Definition Language (DDL:데이터 정의어) | CREATE(DB 객체 생성) ALTER(DB 객체 변경) DROP(DB 객체 삭제) RENAME(DB 객체이름 변경) TRUNCATE(객체 정보 절삭) |
--문법
CREATE TABLE [스키마].테이블명
(컬럼명 데이터타입 [DEFAULT 값 | 제약조건][,...]);
CREATE TABLE DEPT_2
( deptno number(2),
dname varchar2(10),
loc varchar2(10) );
CREATE TABLE emp2
(empno number(4),
ename varchar2(20),
hiredate date default sysdate,
sal number(7,2));
CREATE TABLE table
[(col, col ....)]
AS subquery
CREATE TABLE deptA
AS
SELECT * FROM dept;
CREATE TABLE deptC
AS
SELECT *
FROM dept
WHERE 1=2;
테이블에 올바르지 않은 부적절한 데이터가 저장되는 것을 방지하기 위해서 테이블을 생성할 때 각 컬럼에 대해서 정의하는 여러 가지 규칙을 의미한다.
이는 DB의 설계 단계에서 데이터의 무결성을 보장 받기 위한 방법이다.
[표]제약조건 타입
제약 조건 타입 | 설명 |
---|---|
NOT NULL | 해당 컬럼 값으로 NULL을 허용하지 않는다. 컬럼 레벨 방식만 지원한다. |
UNIQUE | 테이블 내에서 해당 컬럼 값은 항상 유일한 값을 갖는다. 컬럼 레벨/테이블 레벨 방식 모두 지원한다. |
PRIMARY KEY | 해당 컬럼 값은 반드시 존재해야 하고 유일해야 한다. 즉, NOT NULL과 UNIQUE조건을 결합한 형태이다. 컬럼 레벨/테이블 레벨 방식 모두 지원한다. |
FOREIGN KEY | 해당 컬럼의 값이 다른 테이블의 컬럼의 값을 참조해야한다. 즉, 참조되는 컬럼에 없는 값은 저장이 불가능하다. 컬럼 레벨/테이블 레벨 방식 모두 지원한다. |
CHECK | 해당 컬럼에 가능한 데이터 값의 범위나 사용자 조건을 지정한다. 컬럼 레벨/테이블 레벨 방식 모두 지원한다. |
-- 컬럼 레벨
CREATE TABLE [스키마].테이블명
( 컬럼명 데이터타입, [CONSTRAINT 제약조건명] PRIMARY KEY,
컬럼명 데이터타입,
...
);
-- 테이블 레벨
CREATE TABLE [스키마].테이블명
( 컬럼명 데이터타입,
컬럼명 데이터타입,
[CONSTRAINT 제약조건명] PRIMARY KEY(컬럼명[, 컬럼명2])
);
--컬럼 레벨
CREATE TABLE depart(
deptno number(2) constraint depart_deptno_pk PRIMARY KEY,
dname varchar2(15),
loc varchar2(15));
--테이블 레벨
CREATE TABLE pk_tab2(
id number(2),
name varchar2(10),
CONSTRAINT pk_tab2_id_pk PRIMARY KEY(id));
CREATE TABLE depart3(
deptno number(2),
dname varchar2(15),
loc varchar2(15),
constraint depart3_deptno_pk PRIMARY KEY(deptno, loc)
);
-- 해당 테이블의 제약조건 보기(데이터 사전)에서
SELECT *
FROM USER_CONSTRAINTS
WHERE table_name = 'DEPART';
[표] 제약조건 타입
constraint_type 값 | 설명 |
---|---|
P | PRIMARY KEY |
R | FOREIGN KEY |
U | UNIQUE |
C | NOT NULL, CHECK |
SYS_
라는 접두사가 붙은 이름으로 제약조건명이 설정된다.USER_CONS_COLUMNS 데이터 사전
- 어떤 컬럼에 제약조건이 설정되어 있는지를 확인할 수 없다.
- 어떤 컬럼에 제약조건이 정의되었는지를 확인하기 위해서는 USER_CONS_COLUMNS 데이터 사전을 이용해야 한다.
SELECT * FROM USER_CONS_COLUMNS WHERE table_name = 'DEPARTMENT';
--컬럼 레벨
CREATE TABLE [스키마].테이블명
( 컬럼명 데이터타입, [CONSTRAINT 제약조건명] UNIQUE,
컬럼명 데이터타입,
...
);
-- 테이블 레벨
CREATE TABLE [스키마].테이블명
( 컬럼명 데이터타입,
컬럼명 데이터타입,
[CONSTRAINT 제약조건명] UNIQUE(컬럼명[, 컬럼명2])
);
CREATE TABLE uni_tab1(
deptno number(2) constraint uni_tab1_deptno_uk UNIQUE,
dname varchar2(14),
loc varchar2(13));
CREATE TABLE uni_tab2(
deptno number(2),
dname varchar2(14),
loc varchar2(13),
Constraint uni_tab2_deptno_uk UNIQUE (deptno));
CREATE TABLE sawon_4
( s_no number(2),
s_name varchar2(10),
s_email varchar2(20),
constraint sawon_4_uk UNIQUE( s_name, s_email));
--컬럼 레벨
CREATE TABLE [스키마].테이블명
( 컬럼명 데이터타입, [CONSTRAINT 제약조건명] UNIQUE,
컬럼명 데이터타입,
...
);
--컬럼 레벨
CREATE TABLE [스키마].테이블명
( 컬럼명 데이터타입, [CONSTRAINT 제약조건명] CHECK(조건식),
컬럼명 데이터타입,
...
);
-- 테이블 레벨
CREATE TABLE [스키마].테이블명
( 컬럼명 데이터타입,
컬럼명 데이터타입,
[CONSTRAINT 제약조건명] CHECK(조건식)
);
CREATE TABLE sawon_7
(s_no number(2),
s_name varchar2(10),
s_sal number(10) constraint sawon_7_s_sal_ck check(s_sal < 500));
CREATE TABLE sawon_7
(s_no number(2),
s_name varchar2(10),
s_sal number(10) constraint sawon_7_s_sal_ck check(s_sal < 500));
--문법
--컬럼 레벨
CREATE TABLE [스키마].테이블명
( 컬럼명 데이터타입, [CONSTRAINT 제약조건명] REFERENCES 부모테이블명(컬럼명),
컬럼명 데이터타입,
...
);
-- 테이블 레벨
CREATE TABLE [스키마].테이블명
( 컬럼명 데이터타입,
컬럼명 데이터타입,
[CONSTRAINT 제약조건명] FOREIGN KEY(컬럼명)
REFERENCES 부모테이블명(컬럼명)
);
CREATE TABLE emp02
(
empno number(4) constraint emp02_empno_pk primary key,
ename varchar2(15),
deptno number(2) constraint emp02_deptno_fk references dept02(deptno)
);
CREATE TABLE emp03
(
empno number(4) constraint emp03_empno_pk primary key,
ename varchar2(15),
deptno number(2),
constraint emp03_deptno_fk foreign key(deptno) references dept02(deptno));
FOREIGN KEY 제약조건의 추가 옵션
- 자식테이블이 참조하는 있는 컬럼의 값을 부모테이블에서 삭제하려고 하면 삭제가 되지 않는다. 그 이유는 참조 무결성 때문이다.
- 이러한 종속적인 상황에서 해결 가능한 방법들이 있다.
1) ON DELETE CASCADE- 이 옵션은 참되는 부모 테이블의 행이 삭제되면, 해당 행을 참조하는 자식 테이블의 행도 같이 연쇄적으로 삭제되도록 한다.
CREATE TABLE emp02 ( empno number(4) constraint emp02_empno_pk primary key, ename varchar2(15), deptno number(2) constraint emp02_deptno_fk references dept02(deptno) on delete cascade );
2) ON DELECT SET NULL
- 참조되는 부모 테이블의 행이 삭제되면, 해당 행이 참조하는 자식 테이블의 컬럼 값을 NULL로 설정한다.
CREATE TABLE emp02 ( empno number(4) constraint emp02_empno_pk primary key, ename varchar2(15), deptno number(2) constraint emp02_deptno_fk references dept02(deptno) on delete set null );
DROP TABLE 테이블명 [CASCADE CONSTRAINTS];
DROP TABLE DEPT02;
DROP TABLE DEPT02 CASCADE CONSTRAINTS;