Bagaimana saya bisa mengganti nama tabel dengan benar dalam SpatiaLite DB?

11

Lapisan spasial (tabel) di SpatiaLite mencakup berbagai objek dan metadata pendukung, termasuk pemicu, indeks, dan entri dalam (minimal) geometry_columnstabel. Saya mencari (lebih disukai) GUI yang akan menangani semua perubahan yang diperlukan dalam sekali jalan, atau (fallback) dokumentasi semua perubahan yang diperlukan agar tidak merusak lapisan spasial.

Tabel memiliki:

  1. Masuk geometry_columns.f_table_name.
  2. Lima pemicu bernama [prefix]_[table_name]_geometry, di mana awalan menunjukkan apakah itu kembalikan transaksi atau pembaruan indeks.
  3. Tiga indeks spasial bernama idx_[table_name]_geometry[_suffix]

Saya telah mencoba ini dalam dua aplikasi, QGIS DB Manager dan SpatiaLite-GUI.

QGIS DB Manager tampaknya memiliki efek berikut:

  1. Pembaruan yang benar geometry_columnsdengan nama tabel baru
  2. Tidak mengganti nama pemicu. Definisi pemicu sebagian dimodifikasi sehingga BEFORE [INSERT|UPDATE|DELETE]merujuk ke nama tabel baru, tetapi kondisi masih mencari nama lama di geometry_columns.
  3. Tidak mengganti nama indeks spasial. Tidak yakin apakah ini penting karena pemicu masih merujuk pada nama indeks yang lama.

Ketika Anda memilih Maintenance → Ganti nama tabel di SpatiaLite-GUI, Anda hanya mendapatkan tulisan SQL ALTER TABLE. Ini adalah SQL langsung dan bahkan kurang dari QGIS DB Manager. Jika Anda mengisi nama tabel baru, tabel akan diganti namanya. Efek lain:

  1. Tabel tidak tidak bisa diganti di geometry_columns.f_table_name, yang berarti banyak GISes tidak akan melihat tabel sebagai lapisan spasial.
  2. Tidak mengganti nama pemicu. Definisi pemicu sebagian dimodifikasi sehingga BEFORE [INSERT|UPDATE|DELETE]merujuk ke nama tabel baru, tetapi kondisi masih mencari nama lama di geometry_columns.
  3. Tidak mengganti nama indeks spasial. Tidak yakin apakah ini penting karena pemicu masih merujuk pada nama indeks yang lama.

Perhatikan bahwa Spatialite-GUI memang memberikan opsi untuk memulihkan kolom geometri yang menambahkan entri yang benar ke geometry_columns(tetapi mengharuskan Anda untuk menentukan SRID, tipe geometri, dan dimensi), untuk membangun atau membangun kembali indeks spasial, dan untuk memulihkan pemicu, tetapi tidak ada dari fungsi-fungsi ini menghapus baris tabel tua, pemicu, atau indeks, yang mengarah ke DB dengan banyak schmutz (mungkin tidak berbahaya tapi menjengkelkan) di dalamnya.

Lee Hachadoorian
sumber
3
Saya pikir ada kebutuhan besar untuk "Table Manager" untuk menata ulang, mengganti nama, menghapus bidang dll di SpatiaLite jika kita ingin menyingkirkan file bentuk. Tapi, untuk alasan yang tidak diketahui, tidak ada alat seperti itu yang akan membantu kami dengan itu, sejauh yang saya tahu. Mungkin akan menjadi proyek yang bagus untuk inisiatif pendanaan kerumunan!
Bernd V.
Versi spatialite-gui yang Anda miliki?
user30184
SpatiaLite-GUI 1.7.1.
Lee Hachadoorian

Jawaban:

2

Anda perlu menyalin tabel dengan nama tabel baru dan mengganti nama kolom saat Anda menyalin data. Fungsi table manager akan ideal untuk ini tetapi belum dibuat untuk gui. Tautan di bawah ini menunjukkan beberapa informasi formal untuk ini dengan kode sampel dalam SQLite. SpatiaLite adalah bagian dari SQLite sehingga pengkodeannya sama. Semoga berhasil!

https://blog.xojo.com/2013/12/04/renaming-columns-in-sqlite-tables/

Julia
sumber
Perhatikan bahwa pertanyaannya adalah tentang mengganti nama tabel , bukan kolom . Halaman tertaut membahas ALTER TABLEpernyataan itu, tetapi pertanyaannya sudah membahas mengapa ini tidak memadai untuk database spasial.
Lee Hachadoorian
Setelah melihat lebih jauh dengan komentar Anda, saya tidak berpikir bahwa ada cara yang memadai untuk melakukan ini dan mempertahankan pemicu dan komponen struktural lainnya. Tampaknya Anda perlu menulis ulang kode atau ketika Anda ingin mengekspor tabel (jika Anda berencana untuk melakukannya), gunakan nama yang berbeda di manajer db di QGIS.
Julia