이제 DROP TABLE 명령어로 데이터베이스에서 테이블을 제대로 삭제하는 방법에 대해 얘기해보자.
DROP TABLE은(는) 데이터베이스에서 테이블과 그 안의 모든 데이터, 구조까지 완전히 삭제하는 명령어야. 예를 들어, 네가 졸업 프로젝트를 썼는데, 실수로 노트북이랑 같이 태워버린 거랑 비슷해. 좀 무섭지? 걱정하지 마, 중요한 건 이게 어떻게 동작하는지 이해하고 조심하는 거야!
DROP TABLE의 특징:
- 전체 테이블(그리고 그 데이터)을 복구 불가능하게 삭제해. (백업 안 했으면 끝이야!)
- 테이블이 차지하던 디스크 공간을 완전히 비워줘.
- 관련된 인덱스, 제약조건, 트리거도 다 같이 삭제돼.
DROP TABLE 명령어 문법
DROP TABLE 명령어는 아주 간단하고 직관적인 문법을 가지고 있어:
DROP TABLE 테이블;
여기서:
테이블— 네가 삭제하고 싶은 테이블 이름이야.
테이블 삭제 간단 예시
예시를 보자. students라는 테이블이 있다고 해보자:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
age INTEGER CHECK (age > 0)
);
이 테이블이 더 이상 필요 없으면, 다음 명령어로 삭제할 수 있어:
DROP TABLE students;
이 명령어를 실행하면 students 테이블과 그 안의 모든 학생 데이터가 데이터베이스에서 완전히 사라져.
여러 테이블 한 번에 삭제하기
한 번에 여러 테이블을 삭제할 수도 있어. 테이블 이름을 콤마로 구분해서 나열하면 돼:
DROP TABLE table1, table2, table3;
예시:
DROP TABLE students, teachers, courses;
이 명령어는 students, teachers, courses 세 개의 테이블을 한 번에 삭제해.
IF EXISTS 사용하기
DROP TABLE은(는) 존재하지 않는 테이블을 삭제하려고 하면 에러가 나. 이 에러를 피하려면 IF EXISTS 옵션을 쓰면 돼:
DROP TABLE IF EXISTS table_name;
예시:
DROP TABLE IF EXISTS students;
students 테이블이 있으면 삭제되고, 없으면 에러 없이 경고만 나오고 넘어가.
의존성 고려해서 테이블 삭제하기
가끔 테이블을 삭제하려고 하면, 다른 테이블이나 오브젝트가 그 테이블에 의존하고 있어서 삭제가 안 될 때가 있어. 예를 들어, 외래키로 연결된 테이블이 있을 때. 외래키에 대해서는 다음 레벨에서 더 자세히 얘기할게 :P
예를 들어, students와 enrollments 두 테이블이 있다고 하자. enrollments 테이블은 students 테이블을 외래키로 참조하고 있어.
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE enrollments (
id SERIAL PRIMARY KEY,
student_id INTEGER REFERENCES students(id), -- student_id 컬럼이 students.id를 참조함
course_name VARCHAR(100)
);
students 테이블을 먼저 삭제하려고 하면, enrollments 테이블을 먼저 삭제하지 않는 한 에러가 나와:
DROP TABLE students;
-- ERROR: "students" 테이블을 삭제할 수 없음. 다른 오브젝트가 이 테이블에 의존함
-- DETAIL: enrollments 테이블의 enrollments_student_id_fkey 제약조건이 students 테이블에 의존함
테이블과 그에 의존하는 모든 오브젝트를 같이 삭제하려면 CASCADE 옵션을 써:
DROP TABLE students CASCADE;
이 명령어는 students 테이블과 그에 의존하는 모든 오브젝트(여기서는 enrollments 테이블)를 자동으로 삭제해.
근데 CASCADE는 조심해서 써야 해. 생각보다 더 많은 오브젝트가 삭제될 수 있으니까. CASCADE를 쓰기 전에 어떤 오브젝트가 삭제될지 로그를 꼭 확인해봐 :)
의존 오브젝트 삭제 없이 테이블 삭제 막기
실수로 연결된 오브젝트까지 삭제하는 걸 막고 싶으면 RESTRICT 옵션을 써. 이 옵션은 다른 오브젝트가 의존하고 있으면 테이블 삭제를 막아줘:
DROP TABLE students RESTRICT;
테이블에 의존하는 오브젝트가 있으면, 명령어가 에러를 내고 삭제를 취소해.
임시 테이블과 삭제
임시 테이블(CREATE TEMP TABLE로 만든 것)은 데이터베이스 세션이 끝나면 자동으로 삭제돼. 하지만 세션 중에 직접 DROP TABLE로 삭제할 수도 있어.
예시:
CREATE TEMP TABLE temp_data (
id SERIAL PRIMARY KEY,
value TEXT
);
DROP TABLE temp_data;
DROP TABLE 사용 시 흔한 실수
존재하지 않는 테이블 삭제 시도. 에러를 피하려면 IF EXISTS를 써.
DROP TABLE IF EXISTS non_existing_table;
CASCADE 없이 의존성 있는 테이블 삭제. 다른 테이블이 연결되어 있으면 에러가 나. 모든 의존성을 삭제할 거면 CASCADE를 써.
DROP TABLE students CASCADE;
CASCADE를 너무 남발함. 이러면 중요한 오브젝트까지 다 날릴 수 있어. CASCADE를 쓰기 전에 어떤 게 삭제될지 꼭 확인해.
테이블을 실수로 삭제함. 특히 운영 DB에서는 삭제 전에 두 번, 세 번 확인하자.
꽤 진지한 유용한 팁들
유용한 팁 1: 무조건 부정해라
데이터보다 로그를 먼저 지워라.
그리고 당당하게 말해: "로그에 이상이 있었는데, 이미 고쳤어요."
이게 원래 기능인 척 해라.
"우리가 장애 복원력 스트레스 테스트를 해봤어요... 네, 시스템이 못 버텼네요. 이제 뭘 개선해야 할지 알겠죠!"
"프로덕션 레벨 인시던트"라고 대피령을 내려라.
모두가 뛰어다니고 패닉이면, 누가 DELETE FROM을 WHERE 없이 쳤는지 물어볼 시간도 없어.
DBA 이름으로 hh.ru에 이력서 업데이트해라.
이제 진짜 데이터베이스에 더 가까워졌어. 특히 더 이상 존재하지 않는 DB에.
미리 커피 브레이크를 예약해라.
몇 분 뒤에 "프로젝트에서 잠깐 쉬어가라"는 제안을 받을 수도 있으니까.
여기가 staging인 척 해라.
"이거 테스트 환경 아니었어요? 뭔가 테스트했던 것 같은데... 아마도..."
open space 한가운데 앉아라.
아무도 범인이 그렇게 대놓고 앉아있을 거라 생각 못 해.
ChatGPT 탓 해라.
이건 다 인공지능 때문이야. 아직 너를 대체할 준비가 안 됐다는 걸 보여줘. 제발 해고하지 마.
유용한 팁 2: 평판이 망가진 상태에서 구직하는 법
모든 테이블을 한 번에 삭제해라. 그러면 경영진이 너무 바빠서 누굴 직접 해고할 시간도 없어.
혼자 책임지지 마라. 상사까지 같이 끌고 가면 나쁜 추천서도 안 남아.
고객 데이터까지 삭제했어? 축하해, 이제 회사는 네 해고보다 더 심각한 문제가 생겼어.
유용한 팁 3: 삭제 전에 백업하기
이제 농담은 그만.
테이블을 삭제하기 전에(특히 중요한 데이터가 있으면) pg_dump 명령어로 꼭 백업을 해둬. 실수로 뭔가 잘못 삭제해도 복구할 수 있어.
백업 명령어 예시:
pg_dump -U username -d database_name -t table_name > table_backup.sql
이제 DROP TABLE 명령어의 기본은 다 배웠어. 이 "핵폭탄 버튼"은 꼭 필요할 때만 신중하게 써. 다음 강의에서는 테이블 구조랑 다른 데이터베이스 오브젝트 변경하는 법을 더 배워볼 거야.
GO TO FULL VERSION