SpatiaLite DB'de bir tabloyu nasıl düzgün bir şekilde yeniden adlandırabilirim?


11

SpatiaLite içindeki uzamsal katmanlar (tablolar), tetikleyiciler, dizinler ve geometry_columnstablodaki (en azından) girişler dahil olmak üzere çeşitli destekleyici nesneleri ve meta verileri içerir . Ben (tercihen) tek seferde tüm gerekli değişiklikleri idare edecek bir GUI veya uzamsal katmanları kırmamak için gerekli tüm değişikliklerin belgelerini (geri dönüş) arıyorum.

Tablolar:

  1. Giriş geometry_columns.f_table_name.
  2. Beş tetikleyici adı verilir [prefix]_[table_name]_geometry; burada önek, işlemin geri alınması veya dizin güncelleştirmesi olup olmadığını gösterir.
  3. Üç uzamsal indeks idx_[table_name]_geometry[_suffix]

Bunu QGIS DB Manager ve SpatiaLite-GUI olmak üzere iki uygulamada denedim.

QGIS DB Manager aşağıdaki etkilere sahiptir:

  1. geometry_columnsYeni tablo adıyla doğru güncelleme
  2. Tetikleyicileri yeniden adlandırmaz. Tetikleyici tanımı kısmen değiştirilir, bu nedenle BEFORE [INSERT|UPDATE|DELETE]yeni tablo adını gösterir, ancak koşul yine de eski adı arar geometry_columns.
  3. Uzamsal indeksleri yeniden adlandırmaz. Tetikleyiciler hala eski dizin adlarına başvurduğundan bunun önemli olup olmadığından emin değilim.

SpatiaLite-GUI'de Bakım → Tabloyu yeniden adlandır'ı seçtiğinizde, bir SQL ALTER TABLEifadesinin saplamasını alırsınız . Bu basit bir SQL ve QGIS DB Manager'dan bile daha az. Yeni tablo adını doldurursanız, tablo yeniden adlandırılır. Diğer etkiler:

  1. Tablo gelmez değil de değiştirildi olsun geometry_columns.f_table_namebirçok GISes bir mekansal katman olarak tabloya bakınız olmayacak demektir.
  2. Tetikleyicileri yeniden adlandırmaz. Tetikleyici tanımı kısmen değiştirilir, bu nedenle BEFORE [INSERT|UPDATE|DELETE]yeni tablo adını gösterir, ancak koşul yine de eski adı arar geometry_columns.
  3. Uzamsal indeksleri yeniden adlandırmaz. Tetikleyiciler hala eski dizin adlarına başvurduğundan bunun önemli olup olmadığından emin değilim.

Spatialite-GUI'nin, geometry_columnsuzamsal bir dizin oluşturmak veya yeniden oluşturmak ve tetikleyicileri kurtarmak için doğru girişi ekleyen (ancak SRID, geometri türü ve boyutları belirtmenizi gerektirir) bir geometri sütunu kurtarma seçeneği sunduğunu unutmayın. Bu işlevlerin çoğu eski tablo satırlarını, tetikleyicileri veya dizinleri kaldırarak, içinde çok sayıda (muhtemelen zararsız ama sinir bozucu) schmutz bulunan bir DB'ye yol açar.


3
Ben şekil dosyalarından kurtulmak istiyorsak SpatiaLite vb alanları yeniden düzenlemek, yeniden adlandırmak, silmek için bir "Tablo Yöneticisi" için büyük bir ihtiyaç olduğunu düşünüyorum. Ancak, bilinmeyen nedenlerden dolayı, bildiğim kadarıyla bize yardımcı olacak böyle bir araç yok. Belki bir kalabalık finansman girişimi için iyi bir proje olurdu!
Bernd

Hangi spatialite-gui sürümüne sahipsiniz?
user30184

SpatiaLite-GUI 1.7.1.
Lee Hachadoorian

Yanıtlar:


2

Tabloyu yeni bir tablo adıyla kopyalamanız ve verileri kopyalarken sütunları yeniden adlandırmanız gerekir. Bir tablo yöneticisi işlevi bunun için ideal olabilir, ancak henüz GUI için oluşturulmamıştır. Aşağıdaki bağlantı, SQLite'deki örnek kodla bunun için bazı resmi bilgileri gösterir. SpatiaLite, SQLite'nin bir parçasıdır, bu nedenle kodlama aynıdır. İyi şanslar!

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


Sorunun sütunları değil tabloları yeniden adlandırmayla ilgili olduğunu unutmayın . Bağlantı verilen sayfa ifadeyi tartışır , ancak soru zaten bunun uzamsal bir veritabanı için neden yetersiz olduğunu ele almaktadır. ALTER TABLE
Lee Hachadoorian

Bunu aklınızda yorumunuzla daha ileriye inceledikten sonra, bunu yapmak ve tetikleyicileri ve diğer yapısal bileşenleri korumak için yeterli bir yol olduğunu düşünmüyorum. Kodu yeniden yazmanız gerektiği veya tabloyu dışa aktarmaya gittiğinizde (bunu yapmayı planlıyorsanız), QGIS'deki db yöneticisinde farklı bir ad kullanın.
Julia
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.