HOWTO · SQLite

SQLite의 임시 테이블

이 기사에서는 SQLite에서 임시 테이블을 만들고 사용하는 방법에 대해 자세히 설명합니다.

이 페이지의 내용

SQLite 임시 테이블은 데이터베이스 작업 중간 결과를 보관하는 데 사용할 수 있습니다. TEMP 또는 TEMPORARY로 테이블을 만들고, 일반 SQL로 행을 조회하고 변경한 뒤 작업이 끝나면 삭제하면 됩니다. 임시 테이블은 자신을 만든 데이터베이스 연결에 속하므로 연결의 수명에 따라 유지됩니다.

SQLite에서 임시 테이블 만들기

CREATE TEMP TABLE 또는 이에 해당하는 CREATE TEMPORARY TABLE을 사용해 임시 테이블을 정의합니다. 다음 예제는 Python 내장 sqlite3 모듈로 완전한 메모리 내 SQLite 작업 흐름을 실행합니다. CREATE TABLE AS SELECT 문에서 SELECT가 원본 테이블을 읽을 때만 그 원본 테이블이 필요합니다. 열과 값을 직접 지정해 임시 테이블을 정의할 수도 있습니다.

다음 예제를 실행하세요:

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

import sqlite3

connection = sqlite3.connect(":memory:")
connection.execute("CREATE TEMP TABLE users (user_id INTEGER, name TEXT, age INTEGER)")
connection.executemany(
    "INSERT INTO users (user_id, name, age) VALUES (?, ?, ?)",
    [(1, "Ari", 30), (2, "Bo", 25)],
)

connection.execute(
    "CREATE TEMP TABLE recent_users AS "
    "SELECT user_id, name FROM users WHERE age >= 18"
)
rows = connection.execute("SELECT user_id, name, age FROM users ORDER BY user_id").fetchall()
print(rows)

connection.execute("UPDATE users SET age = 31 WHERE user_id = 1")
connection.execute("DELETE FROM users WHERE user_id = 2")
connection.execute("DROP TABLE IF EXISTS temp.users")
connection.close()

Python 예제는 같은 연결에 users가 있는 동안 CREATE TEMP TABLE ... AS SELECT로 recent_users를 만듭니다. SQLite는 쿼리 결과를 바탕으로 새 테이블의 열을 구성합니다. 쿼리가 원본 테이블을 읽는다면 문을 실행할 때 해당 원본이 이미 있어야 합니다. 그렇지 않다면 기존 테이블은 필요하지 않습니다. TEMP와 TEMPORARY는 서로 바꿔 쓸 수 있으므로 한 가지 표기를 일관되게 선택하세요.

임시 테이블의 범위와 수명 이해하기

SQLite는 연결의 임시 데이터베이스에 임시 테이블을 저장합니다. 같은 데이터베이스 파일이나 같은 테이블 이름을 사용하더라도 다른 연결은 해당 연결의 임시 테이블을 공유하지 않습니다. 임시 테이블은 소유한 연결이 닫힐 때 사라집니다. 이는 연결의 수명에 관한 동작이지 애플리케이션 세션의 시간 초과가 아닙니다. 따라서 연결을 재사용하는 코드는 해당 연결을 닫거나 테이블을 명시적으로 삭제할 때까지 테이블을 계속 사용할 수 있습니다.

이러한 범위 덕분에 임시 테이블은 영구 애플리케이션 데이터로 보관할 필요가 없는 중간 결과를 저장하는 데 유용합니다. 반면 연결을 닫으면 필요한 임시 행도 사라집니다. 필요한 결과는 연결을 닫기 전에 영구 테이블로 복사하거나 조회하세요.

임시 테이블 조회하기

일반적인 SELECT 구문으로 임시 테이블을 조회할 수 있습니다. 예를 들면 SELECT user_id, name FROM users WHERE age >= 18;과 같습니다. 이름이 영구 테이블과 겹치지 않으면 이 쿼리는 임시 테이블을 대상으로 합니다. 대상을 명확히 지정하려면 temp.users처럼 스키마를 붙이세요. 데이터는 해당 테이블을 소유한 연결에서만 조회할 수 있습니다.

공통 테이블 식을 사용해 임시 데이터를 읽는 쿼리를 구성할 수도 있습니다. WITH는 문 안에 이름이 지정된 쿼리 결과를 정의하며, SELECT 하나만 포함하는 문으로 제한되지 않습니다. 예를 들어 인라인 쿼리 WITH adults AS (SELECT user_id, name FROM temp.users WHERE age >= 18) SELECT name FROM adults;는 임시 테이블에서 데이터를 읽고 선택된 이름을 반환합니다. 중간 쿼리 이름이 문을 더 명확하게 만들지 않는다면 직접 SELECT를 사용하세요.

임시 테이블의 행 삽입, 업데이트, 삭제하기

각 문이 임시 테이블을 대상으로 하는지 확인하면서 다른 SQLite 테이블에서처럼 INSERT, UPDATE, DELETE를 사용하세요. 예를 들어 INSERT INTO temp.users (user_id, name, age) VALUES (3, 'Cy', 28);은 행을 추가합니다. 특정 행을 바꾸려면 UPDATE temp.users SET age = 29 WHERE user_id = 3;을 사용하세요. WHERE 조건은 일치하는 행만 변경 대상으로 제한합니다. 이 조건이 없으면 대상 테이블의 모든 행이 업데이트됩니다.

특정 행을 제거하려면 DELETE FROM temp.users WHERE user_id = 3;을 사용하세요. SQLite에서는 DELETE 뒤에 별표를 붙이지 않습니다. WHERE를 생략하면 임시 테이블 자체는 남겨 둔 채 모든 행을 삭제합니다. 이러한 작업은 임시 데이터만 변경하며 같은 이름의 영구 테이블에는 영향을 주지 않습니다. 데이터베이스에 영구 users 테이블도 있다면 대상 이름과 스키마를 명확히 지정하세요.

임시 테이블 안전하게 삭제하기

DROP TABLE temp.users;로 임시 테이블을 명시적으로 삭제합니다. temp. 한정자는 임시 스키마를 지정하므로 같은 이름의 영구 테이블을 잘못 삭제하는 일을 방지하는 데 도움이 됩니다. 테이블이 이미 삭제되었을 가능성이 있다면 DROP TABLE IF EXISTS temp.users;를 사용하세요. IF EXISTS 절이 있으면 해당 임시 테이블이 없어도 문을 안전하게 실행할 수 있습니다.

테이블을 삭제하거나 연결을 닫기 전에 보관해야 할 행을 복사하거나 조회하세요. 테이블을 삭제하면 테이블과 그 행이 제거됩니다. 소유한 연결을 닫아도 테이블의 수명이 끝납니다. 연결이 닫힌 뒤에도 사용할 데이터는 영구 테이블에 저장하세요.