개발을 하다보면 코드나 공용으로 사용하는 DB데이터를 develop,stage,prod로 서로 이식하고 옮겨야할 경우가 생깁니다. 그럴 경우 하나씩 일일히 옮기는 거보다 테이블이 크지 않는 경우 통째로 옮기는 것이 가능한대요.
import해서 데이터를 가져온 경우에 단점이 id가 seq로 설정되어 있는 경우 그에 맞춰서 자동으로 갱신되지는 않아서 따로 sql문을 실행해 seq를 맞추는 작업이 필요합니다.
DO $$
DECLARE
rec RECORD;
seq_name text;
max_id bigint;
BEGIN
FOR rec IN
SELECT table_name, column_name,
pg_get_serial_sequence(table_name, column_name) AS seq_name
FROM information_schema.columns
WHERE column_name = 'id' AND table_schema = 'public'
LOOP
seq_name := rec.seq_name;
EXECUTE format('SELECT MAX(id) FROM %I', rec.table_name) INTO max_id;
IF max_id IS NOT NULL THEN
EXECUTE format('SELECT setval(%L, %s)', seq_name, max_id);
END IF;
END LOOP;
END $$;
전체 seq 값을 맞춰주기 때문에 개발 단계에서는 아주 유용한 sql문입니다.
운영 단계에서는 데이터가 많을 시 DB에 많은 과부하를 줄 수 있으므로 사용에 주의하시기 바랍니다.