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 expressionCHECK (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)
- CREATE TABLE - 테이블 만들기
- DROP TABLE - 테이블 제거하기
- CREATE INDEX - 컬럼 인덱싱
- 데이터 타입 - 컬럼 타입과 STRICT 테이블 타입