MySQL CREATE TABLE IF NOT EXISTS 사용법
MySQL에서 CREATE TABLE 문으로 테이블을 생성할 때, 같은 이름의 테이블이 이미 존재하면 에러가 아니라 경고 메시지가 출력됩니다. IF NOT EXISTS 옵션을 사용하면 테이블이 존재하지 않는 경우에만 안전하게 테이블을 생성할 수 있습니다. 지금부터 실제 예제를 통해 이 동작을 단계별로 살펴보겠습니다.
1. 이미 존재하는 테이블을 생성하면 어떻게 될까?
먼저, 이미 존재하는 테이블 이름으로 생성 명령을 실행해 보겠습니다.
mysql> CREATE TABLE IF NOT EXISTS DemoTable
(
CustomerId int,
CustomerName varchar(30),
CustomerAge int
);
Query OK, 0 rows affected, 1 warning (0.05 sec)테이블 이름 DemoTable은 이미 데이터베이스에 존재합니다. 쿼리 자체는 정상적으로 실행된 것처럼 보이지만, '1 warning'이라는 메시지가 표시되는 것을 확인할 수 있습니다.
2. 경고 메시지 확인하기
어떤 경고가 발생했는지 확인하려면 SHOW WARNINGS 명령을 사용합니다.
mysql> show warnings;
위 쿼리를 실행하면 다음과 같은 경고 메시지가 출력됩니다.
+-------+------+------------------------------------+ | Level | Code | Message | +-------+------+------------------------------------+ | Note | 1050 | Table 'demotable' already exists | +-------+------+------------------------------------+ 1 row in set (0.00 sec)
코드 1050번의 Note 레벨 메시지로, 'demotable' 테이블이 이미 존재한다는 내용임을 알 수 있습니다. 즉, 기존 테이블은 그대로 유지되고 새 테이블은 생성되지 않습니다.
3. 존재하지 않는 테이블 생성하기
이번에는 테이블 이름을 변경하여 아직 존재하지 않는 새로운 테이블을 생성해 보겠습니다.
mysql> CREATE TABLE IF NOT EXISTS DemoTable2 ( CustomerId int, CustomerName varchar(20), CustomerAge int ); Query OK, 0 rows affected (0.56 sec)
DemoTable2라는 이름의 테이블은 기존에 존재하지 않았기 때문에 경고 없이 성공적으로 생성되었습니다.
4. 데이터 삽입 및 조회
생성된 테이블에 INSERT 명령으로 레코드를 추가해 보겠습니다.
mysql> insert into DemoTable2 values(101,'Chris',23); Query OK, 1 row affected (0.17 sec) mysql> insert into DemoTable2 values(102,'Robert',24); Query OK, 1 row affected (0.12 sec)
두 개의 레코드가 정상적으로 삽입되었습니다. 이제 SELECT 명령으로 저장된 데이터를 조회합니다.
mysql> select *from DemoTable2;
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
+------------+--------------+-------------+ | CustomerId | CustomerName | CustomerAge | +------------+--------------+-------------+ | 101 | Chris | 23 | | 102 | Robert | 24 | +------------+--------------+-------------+ 2 rows in set (0.00 sec)
정리
CREATE TABLE IF NOT EXISTS를 사용하면 스크립트를 반복 실행하더라도 이미 존재하는 테이블을 덮어쓰거나 에러가 발생하지 않으므로, 배치 작업이나 초기화 스크립트 작성 시 매우 유용합니다. 다만 테이블 구조가 변경된 경우 기존 테이블이 그대로 유지된다는 점을 항상 염두에 두어야 합니다.