서로 다른 데이터베이스에 존재하면서 열 구조까지 다른 두 테이블 사이에서 데이터를 옮기려면 INSERT ... SELECT 문을 사용하면 됩니다. 기본 문법은 다음과 같습니다.
INSERT INTO yourDatabaseName1.yourTableName1(yourColumnName1,yourColumnName2,....N) SELECT yourColumnName1,yourColumnName2,....N FROM yourdatabaseName2.yourTableName2;
즉, 대상 테이블 이름 앞에 데이터베이스 이름을 점(.)으로 연결하여 지정하면, 데이터베이스가 달라도 한 번의 쿼리로 데이터를 복사할 수 있습니다.
이번 예제에서는 두 개의 데이터베이스를 사용합니다.
- sample
- test
1단계: test 데이터베이스에 첫 번째 테이블 생성
먼저 "test" 데이터베이스에 send 테이블을 생성합니다.
mysql> use test;
Database changed
mysql> create table send
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name varchar(20)
-> );
Query OK, 0 rows affected (1.19 sec)데이터 삽입
INSERT 명령으로 몇 개의 레코드를 추가합니다.
mysql> insert into send(Name) values('John');
Query OK, 1 row affected (0.20 sec)
mysql> insert into send(Name) values('Carol');
Query OK, 1 row affected (0.40 sec)저장된 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from send;
실행 결과는 다음과 같습니다.
+----+-------+ | Id | Name | +----+-------+ | 1 | John | | 2 | Carol | +----+-------+ 2 rows in set (0.00 sec)
2단계: sample 데이터베이스에 두 번째 테이블 생성
이번에는 "sample" 데이터베이스에 receive 테이블을 생성합니다. 주목할 점은 첫 번째 테이블과 열 이름이 다르다는 것입니다.
mysql> use sample; Database changed mysql> create table receive -> ( -> UserId int, -> UserName varchar(20) -> ); Query OK, 0 rows affected (0.59 sec)
위에서 볼 수 있듯이, 아직 두 번째 테이블 "receive"에는 어떤 레코드도 들어 있지 않습니다.
3단계: 서로 다른 데이터베이스 간 데이터 이동
이제 열 구조가 다른 두 테이블 사이에서 데이터를 이동시켜 보겠습니다. 쿼리는 다음과 같습니다.
mysql> insert into sample.receive(UserId,UserName) -> select Id,Name from test.send; Query OK, 2 rows affected (0.21 sec) Records: 2 Duplicates: 0 Warnings: 0
여기서 핵심은 SELECT 절의 열 순서와 대상 테이블의 열 순서가 서로 대응되도록 작성한다는 것입니다. 즉, test.send의 Id는 UserId로, Name은 UserName으로 매핑됩니다.
4단계: 결과 확인
sample.receive 테이블의 모든 레코드를 조회합니다.
mysql> select *from receive;
다음 출력 결과를 통해 서로 다른 데이터베이스의 두 테이블 간에 데이터가 성공적으로 이동했음을 확인할 수 있습니다.
+--------+----------+ | UserId | UserName | +--------+----------+ | 1 | John | | 2 | Carol | +--------+----------+ 2 rows in set (0.00 sec)
정리
INSERT ... SELECT 문을 사용하면 데이터베이스가 다르고 열 이름도 다른 테이블이라도, SELECT 절에서 열을 적절히 매핑하기만 하면 손쉽게 데이터를 이동할 수 있습니다. 단, 두 열의 데이터 타입이 호환 가능해야 하며, 대상 테이블에 NOT NULL 제약 조건이 있다면 해당 열에 반드시 값을 제공해야 한다는 점에 유의하세요.