Saya perlu mengimpor data dari database lama ke yang baru, dengan struktur yang sedikit berbeda. Misalnya, dalam database lama, ada tabel yang merekam karyawan dan penyelia mereka:
CREATE TABLE employee (ident TEXT PRIMARY KEY, name TEXT, supervisor_name TEXT)
Sekarang, database baru adalah sebagai berikut:
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));
Yaitu, alih-alih tabel sederhana karyawan dengan nama atasan mereka, database baru (lebih umum) memungkinkan untuk membuat tim orang. Karyawan adalah anggota dengan peran 'e'
, pengawas dengan peran 's'
.
Pertanyaannya adalah bagaimana cara mudah memigrasikan data dari employee
ke struktur baru, satu tim per pasangan karyawan-pengawas. Misalnya karyawan
employee: ('abc01', 'John', 'Dave'), ('abc02', 'Kyle', 'Emily')
harus dimigrasikan sebagai
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')
Saya akan mempertimbangkan untuk menggunakan CTE pemodifikasi data, memasukkan karyawan dan penyelia terlebih dahulu, kemudian tim di antara mereka. Namun, CTE hanya dapat mengembalikan data dari baris tabel yang dimasukkan. Jadi, saya tidak bisa menandingi siapa yang menjadi pengawas siapa.
Satu-satunya solusi yang dapat saya lihat adalah menggunakan plpgsql
, yang hanya akan mengulangi data, tahan ID tim yang dimasukkan dalam variabel sementara, dan kemudian masukkan teammember
baris yang sesuai . Tetapi saya ingin tahu apakah ada solusi yang lebih sederhana atau lebih elegan.
Akan ada sekitar ratusan hingga ribuan karyawan. Meskipun ini umumnya merupakan praktik yang baik, dalam kasus saya, saya tidak ingin membuat ID baru berdasarkan yang lama, karena ID lama adalah string seperti *.GM2
. Saya menyimpannya di old_ident
kolom untuk referensi.
sumber
team
yang akan memegang ID orang yang timnya dibuat akan menyelesaikan masalah. Saya masih penasaran apakah ada solusi yang lebih elegan (yaitu, tidak menggunakan DDL).Jawaban:
Anda memiliki semua informasi yang Anda perlukan untuk mengisi basis data baru dari yang lama dengan 4 pernyataan masukkan:
Anda mungkin harus menyesuaikan dengan selera. Saya mengasumsikan employee.ident dapat dipetakan ke person.id, dan bahwa DBMS Anda memungkinkan menetapkan nilai ke kolom dengan nilai yang dihasilkan secara otomatis. Kecuali itu, itu hanya SQL dasar, tidak ada yang mewah dan, tentu saja , tidak ada loop.
Komentar tambahan:
SERIAL
(dengan 2 miliar kemungkinan) harus banyak, tidak perlu untukBIGSERIAL
.CHECK
atauFOREIGN KEY
kendala untuk teammember.role? Mungkin pertanyaannya menyederhanakan detail ini.sumber
person
tabel.PL / PgSQL akan melakukan pekerjaan itu.
sumber