古いデータベースのデータを、構造が少し異なる新しいデータベースにインポートする必要があります。たとえば、古いデータベースには、従業員とその上司を記録するテーブルがあります。
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
新しい構造に簡単に移行する方法であり、従業員と監督者のペアごとに1つのチームです。たとえば、従業員
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を使用しない)ソリューションがあるかどうか、私はまだ知りたいです。