Oracle Database - DDL – Data Definition Language
DDL 요약
- CREATE TABLE : 테이블 생성
- ALTER TABLE : 테이블 관련 변경
- DROP TABLE : 테이블 삭제
- RENAME : 이름 변경
- TRUNCATE : 테이블의 모든 데이터 삭제 (주의! 절대 복구 안됨)
- COMMENT : 테이블에 설명 추가
테이블 생성
- CREATE TABLE 문 이용
- Syntax
CREATE TABLE [schema.]table_name
(column datatype [DEFAULT expr]
[column_constraints],
......,
[table_constraints]);
Oracle에서의 Table 관리
- Oracle은 Database의 공간을 Tablespace라는 논리적 공간으로 분할하여 관리
- Table을 만들기 위해서는 CREATE TABLE 권한과 객체를 생성할 수 있는 저장장소가 있어야 한다
- DBA는 user에게 권한을 주는 데이터 조작어(DCL) 명령을 사용한다
- 다른 user의 table을 참조하려면 참조되는 테이블은 동일한 데이터베이스 내에 있어야 한다
- 참조하는 테이블이 제약조건을 만드는 user의 소유가 아니라면 소유자 이름(Schema)이 제약조건에서 참조되는 table 이름 앞에 붙어야 한다
- DEFAULT 옵션을 이용하면 column의 기본값을 지정할 수 있다. 새로운 row 입력시 해당 컬럼에 값이 입력되지 않으면 default 옵션에 설정된 값이 자동으로 부여된다
- 테이블명, 컬럼명, 데이터 타입 등 정의
- [연습] 아래 DDL 쿼리를 이용, book 테이블을 만들어 봅시다
CREATE TABLE book (
book_id NUMBER(5),
title VARCHAR2(50),
author VARCHAR2(10),
pub_date DATE DEFAULT SYSDATE
);
DESC 명령을 이용, 생성된 테이블이 원하는 구조대로 만들어졌는지 확인해 봅니다
Subquery를 이용한 테이블 생성
- Subquery의 결과와 동일한 테이블 생성됨
- 질의 결과 레코드들이 포함됨
- NOT NULL 제약 조건만 상속됨
CREATE TABLE it_emps AS(
SELECT * FROM HR.employees
WHERE job_id LIKE 'IT_%'
);
Naming Rules
테이블, 컬럼 등의 이름 명명 규칙
- 문자로 시작
- 30자 이내
- A-Z, a-z, 0-9, _, $, #
- 같은 사용자가 소유한 다른 객체의 이름과 겹치지 않아야 함
(다른 사용자 소유의 객체와는 같을 수도 있음) - 오라클 예약어는 사용할 수 없음
사용자 테이블 (User Tables)
- 사용자에 의해 만들어지고 관리되는 테이블의 집합
- 사용자 정보를 포함함
Data Dictionary
- 오라클 서버에 의해 만들어지고 관리되는 테이블의 집합
- 데이터베이스 정보를 포함
사용 빈도가 가장 높은 타입들
참고
- VARCHAR2와 CHAR의 차이점을 구분한다
- INT, FLOAT 등의 ANSI Type도 내부적으로 NUMBER(38)로 변환됨
ALTER TABLE
* 컬럼 추가 (ADD)
ALTER TABLE book ADD (pubs VARCHAR2(50));
* 컬럼 수정 (MODIFY)
ALTER TABLE book MODIFY (title VARCHAR2(100));
* 컬럼 삭제 (DROP)
ALTER TABLE book DROP (author);
* UNUSED 컬럼
ALTER TABLE book SET UNUSED (author);
ALTER TABLE book DROP UNUSED COLUMNS;
기타 테이블 관련 명령
* 테이블 삭제 (DROP TABLE)
DROP TABLE book;
* 데이터 삭제 (TRUNCATE TABLE)
TRUNCATE TABLE book;
* Comment
COMMENT ON TABLE book IS 'this is comment';
SELECT * FROM user_tab_comments;
* RENAME
RENAME book TO article;
* ROLLBACK 대상이 아님
Constraint(제약조건)
Database 테이블 레벨에서 특정한 규칙을 설정함
예상치 못한 데이터의 손실이나 일관성을 어기는 데이터의 추가, 변경 등을 예방
종류
- NOT NULL
- UNIQUE
- PRIMARY KEY
- FOREIGN KEY
- CHECK
Syntax
CREATE TABLE 테이블명 (
컬럼명 DataType [DEFAULT 기본값][컬럼 제약 조건],
컬럼명 DataType [DEFAULT 기본값][컬럼 제약 조건],
…
[테이블 제약조건] … );
- 컬럼 제약 조건 : [CONSTRAINT 이름] constraint_type
- 테이블 제약 조건 : [CONSTRAINT 이름] constraint_type(column, …)
주의
- 제약조건에 이름을 부여하지 않으면 Oracle이 Sys-Cn의 형태로 자동 부여
NOT NULL
- NULL 값을 허용하지 않음
- 컬럼 형태로만 제약조건 정의할 수 있음(테이블 제약 조건 불가
CREATE TABLE book (
book_id NUMBER(5) NOT NULL
);
UNIQUE
- 중복된 값을 허용하지 않음 (NULL은 들어올 수 있음)
- 복합 컬럼에 대해서도 정의 가능
- 자동적으로 인덱스 생성
CREATE TABLE book (
book_id NUMBER(5) CONSTRAINT c_book_u UNIQUE
);
PRIMARY KEY (*)
- NOT NULL + UNIQUE (인덱스 자동 생성)
- 테이블 당 하나만 나올 수 있음
- 복합 컬럼에 대하여 정의 가능 (순서 중요)
CREATE TABLE book (
...
PRIMARY KEY (book_id)
);
CHECK (Only oracle)
- 임의의 조건 검사 조건식이 참이어야 변경 가능
- 동일 테이블의 컬럼만 이용 가능
CREATE TABLE book (
rate NUMBER CHECK (rate IN (1,2,3,4,5))
);
[연습] author 테이블 생성
- book 테이블의 author 컬럼을 author 테이블로 분리, 관리하고자 합니다.
- 다음 조건으로 author 테이블을 생성해 봅시다
CREATE TABLE author (
author_id NUMBER(10),
author_name VARCHAR2(50) NOT NULL,
author_desc varchar2(500),
-- 컬럼 정의가 끝난 다음 테이블 제약
PRIMARY KEY (author_id)
);
[연습] book 테이블 변경
- book 테이블의 author 컬럼을 삭제해 봅니다
- book 테이블에 author_id 컬럼을 추가합니다
- author 테이블의 author_id 컬럼과 같은 형식(NUMBER(10))으로 지정합니다
-- book 테이블의 author 컬럼을 삭제
alter table book drop column author;
-- author 테이블 참조를 위한 컬럼 author_id 추가
alter table book
add (author_id number(10));
-- book 테이블의 book_id 도 number(10)으로 변경
alter table book
modify (book_id number(10));
desc book;
FOREIGN KEY
참조 무결성 제약
- 일반적으로 REFERENCE 테이블의 PK를 참조
- REFERENCE 테이블에 없는 값은 삽입 불가
- REFERENCE 테이블의 레코드 삭제시 동작
- ON DELETE CASCADE : 해당하는 FK를 가진 참조행도 삭제
- ON DELETE SET NULL : 해당하는 FK를 NULL로 바꿈
CREATE TABLE book (
…
author_id NUMBER(10),
CONSTRAINT c_book_fk FOREIGN KEY (author_id)
REFERENCE author(id)
ON DELETE SET NULL
);
-- book.book_id 에 PK 제약조건 부여
alter table book
ADD CONSTRAINT pk_book_id PRIMARY KEY (book_id);
-- book.author_id를 author.author_id를 참조하도록 제약
alter table book
add constraint fk_author_id FOREIGN KEY (author_id)
REFERENCES author(author_id)
on delete cascade;
ADD / DROP CONSTRAINTS
제약조건 추가
- ALTER TABLE 테이블명 ADD CONSTRAINT …
- NOT NULL은 추가 못함
ALTER TABLE book ADD CONSTRAINT c_book_fk
FOREIGN KEY (author_id) REFERENCES author(author_id);
제약조건 삭제
- ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건명
- PRIMARY KEY의 경우 FK 조건이 걸린 경우에는 CASCADE로 삭제해야 함
ALTER TABLE book DROP CONSTRAINT c_book_fk;
ALTER TABLE author DROP PRIMARY KEY CASCADE;
ENABLE/DISABLE CONSTRAINTS
제약조건 비활성화
- 제약조건 검사를 중지함
- CASCADE를 사용하여 의존되어 있는 다른 조건을 함께 중지시킬 수 있음
- 대규모 데이터 변경 등의 속도를 빠르게 함
- UNIQUE, PRIMARY KEY의 경우 인덱스 제거됨
ALTER TABLE book DISABLE CONSTRAINT c_book_fk CASCADE
제약조건 활성화
- 중지되어 있던 제약조건 검사를 활성화
- UNIQUE, PRIMARY KEY의 경우 인덱스 자동 생성
ALTER TABLE book ENABLE CONSTRAINT c_book_fk CASCADE;
- 제약조건이 걸려 있는 테이블이나 컬럼은 삭제시 에러 발생
ALTER TABLE book DROP (author_id) CASCADE CONSTRAINT;
- 컬럼이나 테이블을 DROP 할 때 관련 제약조건도 함께 삭제할 때
DROP TABLE book CASCADE CONSTRAINT;
Data Dictionary
Oracle이 관리하는 모든 정보를 저장하는 카탈로그
- 내용
- 모든 스키마 객체 정보, 스키가 객체의 공간 정보, 컬럼의 기본값, 제약 조건 정보, 오라클 사용자 정보,
권한 및 룰 정보, 기타 데이터베이스 정보 …
- Base-Table과 View로 구성됨
- VIEW의 Prefix
- USER : 로그인한 사용자 레벨
- ALL : 모든 사용자 정보
- DBA : 관리자
- SYS scheme에 속함
- 주의
- DICTIONARY의 테이블이나 컬럼 이름은 모두 대문자 사용!
- 모든 Dictionary 정보 확인
SELECT * FROM DICTIONARY
- 사용자 스키마 객체 확인 (테이블)
SELECT object_name
FROM user_objects
WHERE object_type = 'TABLE';
- 제약조건 확인 (BOOK 테이블의 예)
SELECT constraint_name, constraint_type,search_condition
FROM user_constraints
WHERE table_name = ‘BOOK';
- 제약조건 컬럼 확인
SELECT constraint_name, column_name
FROM user_cons_columns
WHERE table_name = ‘EMP';
- 모든 사용자 확인 (dba에서 확인 가능)
SELECT username, default_tablespace, temporary_tablespace
FROM DBA_USERS;