[SQL] DDL (Data Definition Language, 데이터 정의어)
DDL(Data Definition Language)은 데이터베이스의 구조를 생성하거나 수정 및 삭제하는데 사용되는 SQL문이다. Oracle 에는 여러가지 Oracle 객체를 가지고 있다.
[DB] Oracle의 5가지 객체 - Table, Index, View, Sequence, Synonym
객체 의미 💡 Table 데이터 저장소 💡 Index 테이블의 검색을 빠르게 💡 View 여러 테이블의 데이터를 조회하는 가상 테이블 💡 Sequence 테이블의 특정 컬럼값을 자동으로 넘버링 💡 Synonym 테이블
gangintheremark.tistory.com
1. CREATE
CREATE문은 데이터베이스에서 테이블을 생성하는데 사용된다.
CREATE TABLE [스키마].테이블명 (
컬럼명1 데이터타입,
컬럼명2 데이터타입,
컬럼명3 데이터타입,
..
);
💡 스키마(schema)는 사용자가 데이터베이스에 접근하여 생성한 객체들의 대표 이름을 의미하며 기본적으로 사용자의 계정명과 동일하게 부여된다. 접근 권한을 가진 객체에 접근할 때는 항상 '스키마.객체' 형식으로 사용한다.
1.1 Oracle의 데이터형
-- 💡 Oracle에서 한글 한글자 AL16UTF8이면 2byte AL32UTF8이면 3byte
-- 한글 byte 확인코드
select *
from NLS_DATABASE_PARAMETERS
where parameter = 'NLS_CHARACTERSET';
1.2 DEFAULT 옵션
- 컬럼에 값을 지정하지 않아도 자동으로 기본값이 입력되어 널(null)값 저장 방지
- 주로 현재 날짜 및 성별 같은 고정된 값만 가지는 컬럼에 대해 사용
CREATE TABLE employee2
( eno NUMBER(4),
ename VARCHAR2(20),
hiredate DATE DEFAULT SYSDATE, -- 자동으로 현재 날짜값으로 저장
salary NUMBER(7,2));
1.3 제약조건 (CONSTRAINT)
제약 조건은 테이블에 부적절한 데이터가 저장되는 것을 방지하기 위해서 테이블을 생성할 때 각 컬럼에 대해서 정의하는 규칙을 의미한다. 데이터의 무결성을 보장 받기 위한 방법이다.
[DB] 데이터베이스 제약조건(constraints)
제약조건(constraint)이란 테이블에 부적절한 자료가 입력되는 것을 방지하기 위해서 데이터에 제한을 두는 것이다. 제약조건 타입 설명 💡 primary key 레코드를 식별하기 위한 용도 💡 unique 컬럼에
gangintheremark.tistory.com
제약조건을 지정하는 방식
✅ 컬럼 레벨(Column Level) : 테이블을 생성할 때 각각의 컬럼을 정의하면서 같이 제약조건을 지정
✅ 테이블 레벨(Table Level) : 모든 컬럼을 정의하고 맨 마지막에 제약조건을 지정
NOT NULL 을 제외한 나머지 4개의 제약조건은 컬럼/테이블 레벨 방식 모두 지원한다.
🔎 PIRMARY KEY 제약 조건
① 중복 저장불가
② null값 저장불가
-- 컬럼 레벨
CREATE TABLE [스키마].테이블명(
컬럼명 데이터타입 [CONSTRAINT 제약조건명] PRIMARY KEY,
...
);
-- 테이블 레벨
CREATE TABLE [스키마].테이블명(
컬럼명 데이터타입,
...
CONSTRAINT 제약조건명 PRIMARY KEY(컬럼명[, 컬럼명2]) -- 복합컬럼도 가능
);
-- 생성된 제약조건 확인
SELECT *
FROM USER_CONSTRAINTS
WHERE table_name='테이블명';
🔎 UNIQUE 제약 조건
① 중복 저장불가
② null값 저장가능
-- 컬럼 레벨
CREATE TABLE [스키마].테이블명(
컬럼명 데이터타입 [CONSTRAINT 제약조건명] UNIQUE,
...
);
-- 테이블 레벨
CREATE TABLE [스키마].테이블명(
컬럼명 데이터타입,
...
CONSTRAINT 제약조건명 UNIQUE (컬럼명[, 컬럼명2])
);
🔎 NOT NULL 제약 조건
① null값 저장불가
-- 컬럼 레벨
CREATE TABLE [스키마].테이블명(
컬럼명 데이터타입 [CONSTRAINT 제약조건명] NOT NULL,
...
);
-- 테이블 레벨 방식 사용X
🔎 CHECK 제약 조건
-- 컬럼 레벨
CREATE TABLE [스키마].테이블명(
컬럼명 데이터타입 [CONSTRAINT 제약조건명] CHECK(조건식),
...
);
-- 테이블 레벨
CREATE TABLE [스키마].테이블명(
컬럼명 데이터타입,
...
CONSTRAINT 제약조건명 CHECK (조건식)
);
-- ‘개발’과 ‘인사’ 만 저장 가능하도록 CHECK 제약조건을 지정
CREATE TABLE department(
deptno NUMBER(2) ,
dname VARCHAR2(15) CONSTRAINT department_dname_ck CHECK(dname IN('개발','인사'))
);
🔎 FOREIGN KEY 제약 조건
REFERENCES
키워드를 지정하여 참조하는 부모테이블과 컬럼명을 명시한다. 이때, 참조하는 부모 테이블의 컬럼은 반드시 기본키 PRIMARY KEY
또는 UNIQUE
키로 제약조건이 설정된 컬럼이여야 한다.
-- 컬럼 레벨
CREATE TABLE [스키마].테이블명(
컬럼명 데이터타입 [CONSTRAINT 제약조건명] REFERENCES 부모테이블명(컬럼명),
...
);
-- 테이블 레벨
CREATE TABLE [스키마].테이블명(
컬럼명 데이터타입,
...
CONSTRAINT 제약조건명 FOREIGN KEY(컬럼명) REFERENCES 부모테이블명(컬럼명)
);
💡 추가 옵션
ON DELETE CASCADE
: 부모 테이블의 행이 삭제되면 참조하는 자식 테이블의 행도 같이 삭제ON DELETE SET NULL
: 부모 테이블의 행이 삭제되면 참조하는 자식 테이블의 행의 값은 NULL로 설정
2. DROP
DROP문은 테이블을 삭제하는데 사용한다.
DROP TABLE 테이블명;
💡 CASCADE CONSTRAINTS 옵션
자식테이블이 있는 부모테이블을 삭제할 때 자식테이블도 함께 삭제할 수 있는 옵션이다.
3. ALTER
생성된 테이블에 대한 구조를 변경하는데 사용한다. 테이블에 대한 구조 변경은 컬럼의 추가,삭제 및 컬럼의 타입이나 길이 변경, 제약조건 추가,삭제등이 가능하다.
3.1 컬럼 추가
ALTER TABLE 테이블명
ADD ( 컬럼명 데이터타입 [, 컬럼명2 데이터타입]);
-- employee 테이블에 문자 타입의 email 컬럼과 address 컬럼 추가
ALTER TABLE employee
ADD ( email VARCHAR2(10), address VARCHAR2(20) );
3.2 컬럼 변경
ALTER TABLE 테이블명
MODIFY ( 컬럼명 데이터타입 [, 컬럼명2 데이터타입]);
-- employee 테이블의 email 컬럼 크기를 40byte로 변경
ALTER TABLE employee
MODIFY ( email VARCHAR2(40) );
3.3 컬럼 삭제
ALTER TABLE 테이블명
DROP COLUMN ( 컬럼명 [, 컬럼명2] );
-- employee 테이블의 email 컬럼 삭제
ALTER TABLE emp04
DROP COLUMN ( email );
3.4 제약조건 추가
ALTER TABLE 테이블명
ADD [CONSTRAINT 제약조건명] 제약조건타입(컬럼명);
-- employee 테이블 eno 컬럼 값이 중복되지 않도록 하기 위해 기본키 제약조건 추가
ALTER TABLE employee
ADD CONSTRAINT employee_eno_pk PRIMARY KEY(eno);
3.5 제약조건 삭제
ALTER TABLE 테이블명
DROP CONSTRAINT 제약조건명 [CASCADE];
-- 기본키 PRIMARY KEY와 UNIQUE는 제약조건명 없이 삭제 가능
ALTER TABLE 테이블명
DROP PRIMARY KEY | UNIQUE(컬럼)
3.5 제약조건 활성화/비활성화
ALTER TABLE 테이블명 DISABLE | ENABLE CONSTRAINT 제약조건명 [CASCADE];