구식 데이터베이스에서 구조가 약간 다른 새 데이터베이스로 데이터를 가져와야합니다. 예를 들어, 기존 데이터베이스에는 직원과 그 감독자를 기록하는 테이블이 있습니다.
CREATE TABLE employee (ident TEXT PRIMARY KEY, name TEXT, supervisor_name TEXT)
이제 새 데이터베이스는 다음과 같습니다.
CREATE TABLE person (id BIGSERIAL PRIMARY KEY, name TEXT, old_ident TEXT);
CREATE TABLE team (id BIGSERIAL PRIMARY KEY);
CREATE TABLE teammember (person_id BIGINT, team_id BIGINT, role CHAR(1));
즉, 관리자 이름이있는 일반 직원 테이블 대신 새로운 (보다 일반적인) 데이터베이스를 통해 사람들로 구성된 팀을 만들 수 있습니다. 직원들은 역할 구성원 'e'
, 역할 감독자 's'
.
문제는 employee
직원-관리자 쌍당 한 팀씩 데이터를 새로운 구조 로 쉽게 마이그레이션하는 방법 입니다. 예를 들어 직원
employee: ('abc01', 'John', 'Dave'), ('abc02', 'Kyle', 'Emily')
로 마이그레이션됩니다
person: (1, 'John', 'abc01'), (2, 'Dave', NULL), (3, 'Kyle', 'abc02'), (4, 'Emily', NULL)
team: (1), (2)
teammember: (1, 1, 'e'), (2, 1, 's'), (3, 2, 'e'), (4, 2, 's')
데이터 수정 CTE를 사용하여 직원과 감독자를 먼저 삽입 한 다음 팀을 고려하는 것이 좋습니다. 그러나 CTE는 삽입 된 테이블 행에서만 데이터를 리턴 할 수 있습니다. 따라서 나는 누가 누구의 감독자 였는지 일치시킬 수 없습니다.
내가 볼 수있는 유일한 해결책 plpgsql
은 데이터를 반복하고 삽입 된 팀 ID를 임시 변수에 보관 한 다음 적절한 teammember
행 을 삽입하는을 사용하는 것 입니다. 그러나 더 단순하거나 더 우아한 솔루션이 있는지 궁금합니다.
대략 수백에서 수천 명의 직원이있을 것입니다. 일반적으로 좋은 방법이지만 내 경우에는 이전 ID가와 같은 문자열이므로 이전 ID를 기반으로 새 ID를 생성하고 싶지 않습니다 *.GM2
. old_ident
참조 를 위해 열에 저장합니다 .
team
팀을 만든 사람의 ID를 보유 할 임시 식별자를 추가 하면 문제가 해결됩니다. 그래도 더 우아한 (즉, DDL을 사용하지 않는) 솔루션이 있는지 궁금합니다.