문서번호 : 11-697662
Document Information
•
최초 작성일 : 2022.05.13
•
최종 수정일 : 2022.07.14
•
이 문서는 아래 버전을 기준으로 작성되었습니다.
◦
SinglestoreDB : 7.8
Goal
•
auto_increment 컬럼이 있는 테이블의 데이터 이관 방법을 알아본다.
Solution
이관 방안 1 (권장)
⇒ 먼저, 테이블에 데이터를 이관한 후, auto_increment 컬럼의 시작값을 자동으로 동기화 해 주는 명령어 AGGREGATOR SYNC AUTO_INCREMENT를 실행한다.
만약, 어그리게이터가 여러개 있을 경우, 어그리게이터별로 값의 범위(시작-끝)가 있으며, 각각의 범위내에서 자동 동기화 된다.
1.
데이터를 이관한다. (INSERT … SELECT를 사용한 예시)
INSERT INTO to_tbl SELECT * FROM from_tbl;
SQL
복사
주의) Insert … select 구문을 대신해 create table … select 구문을 사용할 경우, 생성 테이블에는 non-auto increment 컬럼으로 생성된다.
2.
데이터 이관이 완료된 후, AGGREGATOR SYNC AUTO_INCREMENT 명령어를 사용하여 auto_increment 컬럼의 시작값을 동기화 시킨다. 이 후 생성되는 값은 존재하는 data보다 큰 값이 된다.
•
문법
AGGREGATOR SYNC AUTO_INCREMENT [ON <database>[.<table>]] [ALL];
SQL
복사
◦
ALL : 모든 어그리게이터에서 동기화됨
▪
마스터 어그리게이터에서만 추가 가능함
▪
쓰지 않으면 실행하는 어그리게이터만 동기화됨
◦
테이블의 경우 데이터베이스명을 반드시 써야 함.
•
사용 예시
◦
하나의 테이블만 동기화 (데이터베이스명 : test_db, 테이블명 : to_tbl)
AGGREGATOR SYNC AUTO_INCREMENT ON test_db.to_tbl ALL;
SQL
복사
◦
특정 데이터베이스 전체 동기화
AGGREGATOR SYNC AUTO_INCREMENT ON test_db ALL;
SQL
복사
또는
use test_db;
AGGREGATOR SYNC AUTO_INCREMENT ALL;
SQL
복사
이관 방안 2 (단, 참조테이블 일때만)
⇒ 테이블 생성시 auto_increment 컬럼의 시작값을 미리 설정해 줄 수 있다.
하지만, 참조테이블은 특별히 시작값을 지정하지 않더라도 최대값 다음부터 자동 채번된다. (예외사항 참고)
1.
이관하려는 테이블(이하, FROM) 에서의 auto_increment 컬럼의 최대 값을 확인한다.
a.
이때, 데이터가 추가되거나 하여, 값이 증가 되는지 확인하고, 여유 있게 증가 시킨다.
SELECT MAX(id) FROM to_tbl;
SQL
복사
2.
이관 받을 테이블(이하, TO) 생성시 AUTO_INCREMENT=n 구문을 추가하여 시작값을 설정한다.
단, 참조(REFERENCE) 테이블일 때만 지원되며, 이외의 경우 구문은 무시된다.
CREATE REFERENCE TABLE to_tbl (id int AUTO_INCREMENT PRIMARY KEY) AUTO_INCREMENT = 100;
SQL
복사
3.
데이터를 이관한다. (INSERT … SELECT를 사용한 예시)
INSERT INTO to_tbl SELECT * FROM from_tbl;
SQL
복사
예외 사항
참조(REFERENCE) 테이블의 경우, 임의의 값을 INSERT/UPDATE 시키더라도, 최대값 + 1로 자동 채번된다.
CREATE REFERENCE TABLE t(id INT AUTO_INCREMENT PRIMARY KEY);
INSERT INTO t values();
INSERT INTO t values(5);
INSERT INTO t values();
SELECT id FROM t ORDER BY id;
+----+
| id |
+----+
| 1 |
| 5 |
| 6 |
+----+
-- UPDATE에 의해 새로운 최대값 이 생겼을때 : 그 최대값 + 1 부터 채번됨
UPDATE t SET id=9 WHERE id=5; -- 5->9로 UPDATE되면서 6보다 큰 값이됨
INSERT INTO t values();
SELECT id FROM t ORDER BY id;
+----+
| id |
+----+
| 1 |
| 6 |
| 9 |
| 10 |
+----+
-- 모두 지웠을때 : 기존 시작값 유지됨
DELETE FROM t;
INSERT INTO t values();
SELECT id FROM t order by id;
+----+
| id |
+----+
| 11 |
+----+
SQL
복사
References
History
일자 | 작성자 | 비고 |
2022.05.13 | kkh | 추가 수정: wee |
2022.06.10 | kkh | 이관 방안으로 내용 수정 |
2022.07.14 | kkh | 내용 정리 및 방안별 설명 추가 |