본문 바로가기
WIKI 기술 지식 베이스

ALTER TABLE

원문 보기 위키 갱신

ALTER TABLE은 기존 테이블의 구조를 수정하는 문이에요. 테이블을 다시 만들고 데이터를 복사할 필요 없이 컬럼을 바꿀 수 있어요.

출처: 문서

본문

기존 테이블의 구조를 수정해요.

문법

ALTER TABLE [schema-name.]table-name RENAME TO new-table-name;
ALTER TABLE [schema-name.]table-name RENAME COLUMN old-column-name TO new-column-name;
ALTER TABLE [schema-name.]table-name ADD COLUMN column-def;
ALTER TABLE [schema-name.]table-name DROP COLUMN column-name;

설명

ALTER TABLE은 테이블을 다시 만들고 데이터를 복사하지 않고도 기존 테이블의 구조를 수정해줘요. Turso는 ALTER TABLE의 네 가지 형태를 지원해요: 테이블 이름 바꾸기, 컬럼 이름 바꾸기, 새 컬럼 추가, 기존 컬럼 삭제.

매개변수

매개변수 설명
schema-name 테이블이 들어 있는 붙은(attached) 데이터베이스 이름. 생략하면 main 데이터베이스
table-name 수정할 테이블 이름

RENAME TO

기존 테이블의 이름을 바꿔요.

ALTER TABLE old_name RENAME TO new_name;

테이블 이름을 바꾸면 다음에 있는 테이블 참조가 모두 갱신돼요:

  • 그 테이블을 참조하는 트리거
  • 그 테이블의 인덱스
  • 외래 키 제약 (부모 테이블과 자식 테이블 양쪽 모두)
  • CHECK 제약
  • 그 테이블을 참조하는 뷰
새 테이블 이름은 같은 데이터베이스의 기존 테이블, 뷰, 인덱스 이름과 겹치면 안 돼요.

예제

CREATE TABLE customers (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL
);

ALTER TABLE customers RENAME TO clients;

-- The table is now accessible as 'clients'
SELECT * FROM clients;

RENAME COLUMN

테이블의 기존 컬럼 이름을 바꿔요.

ALTER TABLE table-name RENAME COLUMN old-column-name TO new-column-name;

컬럼 이름을 바꾸면 다음에 있는 컬럼 참조가 모두 갱신돼요:

  • 그 컬럼을 참조하는 인덱스 (표현식 인덱스 포함)
  • 그 컬럼을 참조하는 트리거
  • 그 컬럼을 참조하는 CHECK 제약
  • 외래 키 제약 정의

제한 사항

다음 경우에는 컬럼 이름 바꾸기가 실패해요:

  • 그 컬럼이 테이블에 없을 때
  • 새 컬럼 이름이 같은 테이블의 기존 컬럼과 충돌할 때
  • 테이블의 트리거가 본문에서 한정된 참조(예: table_name.column_name)를 쓸 때
  • 트리거의 WHEN 절이 그 컬럼을 참조할 때

예제

CREATE TABLE products (
    id INTEGER PRIMARY KEY,
    product_name TEXT NOT NULL,
    price REAL
);

CREATE INDEX idx_name ON products(product_name);

ALTER TABLE products RENAME COLUMN product_name TO name;

-- The index is automatically updated
-- Queries now use the new column name
SELECT name, price FROM products;

ADD COLUMN

기존 테이블에 새 컬럼을 추가해요. 새 컬럼은 항상 마지막 컬럼으로 붙어요.

ALTER TABLE table-name ADD COLUMN column-name type [constraints];

제한 사항

ADD COLUMN으로 추가하는 새 컬럼은 다음 요구 사항을 충족해야 해요:

요구 사항 이유
PRIMARY KEY 제약 없음 테이블의 기본 키는 생성 후 바꿀 수 없어요
UNIQUE 제약 없음 UNIQUE 컬럼을 추가하려면 기존 행 전체를 훑어야 해요
NOT NULL에는 NULL이 아닌 기본값 필요 기존 행들도 새 컬럼의 유효한 값을 가져야 해요
기본값은 상수 표현식이어야 함 리터럴 값, 부호 있는 리터럴, 괄호로 묶인 상수 표현식만 허용돼요. random() 같은 함수는 안 돼요
CURRENT_TIME, CURRENT_DATE, CURRENT_TIMESTAMP 기본값은 빈 테이블이어야 가능 이 비결정적 값들은 기존 행에 소급 적용될 수 없어요
CHECK 제약은 빈 테이블이어야 가능 기존 행에 대해 제약을 검증할 수 없어요
컬럼 이름 중복 없음 컬럼 이름이 테이블에 이미 있으면 안 돼요
GENERATED ALWAYS AS 없음 생성 컬럼은 ALTER TABLE로 추가할 수 없어요
STRICT 테이블은 명시적 타입 필요 컬럼 타입은 유효한 STRICT 타입이어야 해요

지원되는 컬럼 제약

추가되는 컬럼에 쓸 수 있는 제약은 이것들이에요:

  • NOT NULL (NULL이 아닌 기본값과 함께)
  • DEFAULT expression
  • CHECK (expression)
  • REFERENCES (외래 키)
  • COLLATE

예제

간단한 컬럼 추가하기

ALTER TABLE users ADD COLUMN phone TEXT;

기본값이 있는 컬럼 추가하기

ALTER TABLE orders ADD COLUMN priority INTEGER DEFAULT 0;

기본값이 있는 NOT NULL 컬럼 추가하기

ALTER TABLE products ADD COLUMN in_stock INTEGER NOT NULL DEFAULT 1;

외래 키가 있는 컬럼 추가하기

ALTER TABLE orders ADD COLUMN warehouse_id INTEGER REFERENCES warehouses(id);

STRICT 테이블에 컬럼 추가하기

CREATE TABLE metrics (
    id INTEGER PRIMARY KEY,
    value REAL
) STRICT;

-- Must specify a valid STRICT type
ALTER TABLE metrics ADD COLUMN label TEXT DEFAULT 'unknown';

DROP COLUMN

테이블에서 기존 컬럼을 제거해요.

ALTER TABLE table-name DROP COLUMN column-name;

제한 사항

다음 조건 중 하나라도 참이면 컬럼을 삭제할 수 없어요:

조건 오류
컬럼이 PRIMARY KEY이거나 그 일부 Cannot drop PRIMARY KEY column
컬럼에 UNIQUE 제약이 있음 Cannot drop UNIQUE column
컬럼이 인덱스에서 참조됨 Cannot drop indexed column
컬럼이 표현식 인덱스에서 참조됨 Cannot drop column used in expression index
컬럼이 부분 인덱스의 WHERE 절에 이름이 나옴 Cannot drop column used in partial index
컬럼이 다른 컬럼이나 테이블에 속한 CHECK 제약에서 참조됨 Cannot drop column used in CHECK constraint
컬럼이 다른 테이블의 외래 키에서 참조됨 Cannot drop column used in foreign key
테이블에 컬럼이 하나뿐 Cannot drop the last remaining column
컬럼이 트리거나 뷰에 나옴 Cannot drop column referenced by trigger or view

예제

컬럼 삭제하기

ALTER TABLE users DROP COLUMN phone;

삭제 후 컬럼 확인하기

CREATE TABLE example (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    old_field TEXT,
    active INTEGER DEFAULT 1
);

ALTER TABLE example DROP COLUMN old_field;

PRAGMA table_info(example);
-- cid | name   | type    | notnull | dflt_value | pk
-- 0   | id     | INTEGER | 0       | NULL       | 1
-- 1   | name   | TEXT    | 1       | NULL       | 0
-- 2   | active | INTEGER | 0       | 1          | 0

예제

완전한 스키마 진화

-- Create initial table
CREATE TABLE articles (
    id INTEGER PRIMARY KEY,
    title TEXT NOT NULL,
    body TEXT
);

-- Add an author column with a foreign key
ALTER TABLE articles ADD COLUMN author_id INTEGER REFERENCES users(id);

-- Add a publication status
ALTER TABLE articles ADD COLUMN status TEXT NOT NULL DEFAULT 'draft';

-- Rename a column for clarity
ALTER TABLE articles RENAME COLUMN body TO content;

-- Add a nullable timestamp column
ALTER TABLE articles ADD COLUMN updated_at TEXT;

-- Rename the table
ALTER TABLE articles RENAME TO posts;

-- Final schema
PRAGMA table_info(posts);
-- cid | name       | type    | notnull | dflt_value        | pk
-- 0   | id         | INTEGER | 0       | NULL              | 1
-- 1   | title      | TEXT    | 1       | NULL              | 0
-- 2   | content    | TEXT    | 0       | NULL              | 0
-- 3   | author_id  | INTEGER | 0       | NULL              | 0
-- 4   | status     | TEXT    | 1       | 'draft'           | 0
-- 5   | updated_at | TEXT    | 0       | NULL              | 0

더 알아보기 (Learn more)