Create
Create은 SQL(Structured Query Language)의 핵심적인 데이터 정의 언어(DDL, Data Definition Language) 명령어로, 데이터베이스 내에 새로운 객체(오브젝트)를 생성할 때 사용된다. 대표적으로 데이터베이스, 테이블, 인덱스, 뷰, 트리거, 사용자, 저장 프로시저, 함수, 역할(roles) 등을 생성할 수 있다. 대부분의 관계형 데이터베이스 관리 시스템(RDBMS)은 CREATE 문을 기본적으로 지원하며, 객체를 처음 정의할 때 반드시 사용된다.
목차
개요[편집]
SQL의 CREATE 명령어는 데이터베이스의 스키마 정의 작업에서 가장 기본적이며 필수적인 도구이다. 이 명령어는 객체의 구조를 정의하고, 데이터가 저장되거나 처리되는 틀을 만든다. 생성된 객체는 이후 ALTER, DROP, RENAME 등의 명령어로 수정하거나 제거할 수 있다.
CREATE는 한 번 실행되면 대상 객체를 영구적으로 생성하며, 일부 DBMS를 제외하면 트랜잭션에 의해 롤백되지 않는다. 따라서 사용 시 신중해야 한다.
CREATE 문이 지원하는 객체 유형[편집]
- DATABASE : 데이터베이스 생성
- TABLE : 테이블 생성
- VIEW : 가상 테이블(뷰) 생성
- INDEX : 인덱스 생성
- SEQUENCE : 자동 증가 숫자 생성 객체 (Oracle, PostgreSQL 등)
- SCHEMA : 데이터베이스 내 스키마 정의
- USER / ROLE : 사용자 계정 또는 권한 그룹 생성
- FUNCTION : 사용자 정의 함수 생성
- PROCEDURE : 저장 프로시저 생성
- TRIGGER : 트리거 생성 (이벤트 기반 자동 실행 로직)
주요 CREATE 문 종류[편집]
- 데이터베이스 생성
CREATE DATABASE 데이터베이스명;
예시:
CREATE DATABASE shop_db;
- 테이블 생성
CREATE TABLE 테이블명 ( 컬럼1 데이터타입 [제약조건], 컬럼2 데이터타입 [제약조건], ... );
예시:
CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, email VARCHAR(100) UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
- 뷰(View) 생성
CREATE VIEW 뷰이름 AS SELECT 컬럼1, 컬럼2... FROM 테이블명 WHERE 조건;
예시:
CREATE VIEW active_users AS SELECT id, name FROM users WHERE last_login >= '2023-01-01';
- 인덱스(Index) 생성
CREATE INDEX 인덱스명 ON 테이블명 (컬럼명);
예시:
CREATE INDEX idx_email ON users (email); -- 이메일 검색 속도 향상
- CREATE USER / ROLE
CREATE USER dev_user WITH PASSWORD 'securePass123'; CREATE ROLE read_only;
DB 사용자나 역할(권한 그룹)을 생성할 수 있다. 이후 GRANT, REVOKE 명령어로 권한을 부여하거나 회수할 수 있다.
- CREATE FUNCTION / PROCEDURE
CREATE FUNCTION get_tax(salary NUMERIC) RETURNS NUMERIC AS $$ BEGIN RETURN salary * 0.1; END; $$ LANGUAGE plpgsql;
DB 내에서 로직을 캡슐화하여 재사용 가능한 함수나 저장 프로시저를 만들 수 있다.
- CREATE TRIGGER
CREATE TRIGGER update_modified_at BEFORE UPDATE ON employees FOR EACH ROW EXECUTE FUNCTION set_modified_at();
트리거는 특정 이벤트(INSERT, UPDATE, DELETE)가 발생했을 때 자동으로 실행되는 코드 블록을 정의한다.
테이블 생성 시 자주 사용되는 제약 조건[편집]
제약 조건 설명 예시 PRIMARY KEY 고유한 기본 키 설정 id INT PRIMARY KEY FOREIGN KEY 다른 테이블과의 관계 설정 FOREIGN KEY (user_id) REFERENCES users(id) UNIQUE 중복 값 허용 안 함 email VARCHAR(100) UNIQUE NOT NULL NULL 값 허용 안 함 name VARCHAR(50) NOT NULL DEFAULT 기본값 지정 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP AUTO_INCREMENT (MySQL) 자동 증가 숫자 id INT AUTO_INCREMENT
IF NOT EXISTS 옵션[편집]
대부분의 현대 RDBMS는 CREATE 문에 IF NOT EXISTS 구문을 지원하여, 이미 존재하는 객체가 있을 경우 오류 없이 건너뛰도록 설정할 수 있다.
CREATE TABLE IF NOT EXISTS employees (...); CREATE DATABASE IF NOT EXISTS company_db;
이 옵션은 마이그레이션 스크립트나 배포 자동화 시 유용하다.
CREATE와 트랜잭션[편집]
- 대부분의 DBMS에서 CREATE는 자동 커밋이 적용되는 DDL 명령어이다.
- 예외적으로 PostgreSQL 등은 CREATE를 트랜잭션 내에서 사용할 수 있지만, 일부 객체 유형은 제한이 있을 수 있다.
보안 및 권한[편집]
- CREATE 명령어는 일반 사용자에게 허용되지 않으며, 해당 객체를 만들 수 있는 적절한 권한이 필요하다.
- 예를 들어, CREATE DATABASE는 보통 슈퍼유저나 CREATEDB 권한을 가진 사용자만 실행할 수 있다.
- CREATE TABLE, CREATE VIEW 등은 소속 스키마나 데이터베이스에 대한 권한이 필요하다.
CREATE 관련 시스템 메타데이터[편집]
객체가 생성되면 DBMS는 해당 정보를 시스템 카탈로그나 정보 스키마(information_schema)에 기록한다.
예시:
SELECT * FROM information_schema.tables WHERE table_name = 'employees';
이 정보를 통해 객체 존재 여부를 프로그램적으로 확인하거나, DB 문서 자동화를 할 수 있다.
주의 사항 및 베스트 프랙티스[편집]
- CREATE로 객체를 만들기 전에 충돌 여부를 확인하거나 IF NOT EXISTS 옵션을 사용하는 것이 좋다.
- 테이블 설계 시, 가능한 한 명확한 데이터 타입, 적절한 제약 조건, 인덱스를 포함시키자.
- 생성한 객체는 나중에 DROP, ALTER, RENAME 등의 명령어로 관리된다.
- 협업 환경에서는 DDL 변경 사항을 버전 관리하는 것이 중요하다 (예: Liquibase, Flyway).
활용 예시[편집]
- 외래 키가 포함된 테이블 생성
CREATE TABLE orders ( order_id INT PRIMARY KEY, user_id INT, product_name VARCHAR(100), FOREIGN KEY (user_id) REFERENCES users(id) );
- 복합 기본 키(Composite Key) 설정
CREATE TABLE course_registrations ( student_id INT, course_id INT, PRIMARY KEY (student_id, course_id) -- 두 컬럼의 조합이 고유함 );
Create vs alter[편집]
항목 CREATE ALTER 기능 새 객체(테이블, 인덱스, 뷰 등)를 생성 기존 객체의 구조를 수정 사용 시점 객체가 처음 만들어질 때 객체가 이미 존재한 후 변경할 때 대표 예시 CREATE TABLE users (...) ALTER TABLE users ADD COLUMN age INT 영향 대상 전체 구조를 처음 정의함 일부 속성(컬럼, 제약조건 등)을 수정 롤백 여부 보통 트랜잭션에 포함되지 않아 롤백 불가 일부 DBMS에서는 트랜잭션 내 사용 가능 실행 실패 시 이미 존재할 경우 오류 발생 (unless IF NOT EXISTS) 수정 대상이 없거나 잘못되면 오류 발생 보안/권한 생성 권한 필요 (CREATE 권한) 수정 권한 필요 (ALTER 권한)
- CREATE는 "무에서 유를 만드는" 명령어다. 새로운 테이블, 뷰, 사용자 등 처음부터 정의할 때 쓴다.
- ALTER는 "이미 있는 걸 고치는" 명령어다. 테이블에 컬럼을 추가하거나 이름을 바꾸고, 제약조건을 바꾸고 싶을 때 사용한다.
같이 보기[편집]