ฉันจะเปลี่ยนชื่อโต๊ะใน SpatiaLite DB ได้อย่างไร


11

เลเยอร์พื้นที่ (ตาราง) ใน SpatiaLite ประกอบด้วยวัตถุและเมตาดาต้าที่รองรับต่าง ๆ รวมถึงทริกเกอร์ดัชนีและรายการใน (อย่างน้อยที่สุด) ในgeometry_columnsตาราง ฉันกำลังมองหา (ควร) GUI ที่จะจัดการกับการเปลี่ยนแปลงที่จำเป็นทั้งหมดในครั้งเดียวหรือ (ทางเลือก) เอกสารประกอบของการเปลี่ยนแปลงที่จำเป็นทั้งหมดเพื่อที่จะไม่ทำลายชั้นอวกาศ

ตารางมี:

  1. geometry_columns.f_table_nameรายการใน
  2. ทริกเกอร์ชื่อห้าตัว[prefix]_[table_name]_geometryโดยที่คำนำหน้าระบุว่าเป็นการย้อนกลับธุรกรรมหรือการอัพเดตดัชนี
  3. ดัชนีอวกาศสามชื่อ idx_[table_name]_geometry[_suffix]

ฉันได้ลองสิ่งนี้ในสองแอพพลิเคชั่นคือ QGIS DB Manager และ SpatiaLite-GUI

QGIS DB Manager ปรากฏว่ามีผลกระทบต่อไปนี้

  1. อัปเดตอย่างถูกต้องgeometry_columnsด้วยชื่อตารางใหม่
  2. ห้ามเปลี่ยนชื่อทริกเกอร์ นิยามทริกเกอร์ที่มีการแก้ไขบางส่วนเพื่อให้BEFORE [INSERT|UPDATE|DELETE]หมายถึงชื่อตารางใหม่ geometry_columnsแต่ยังคงสภาพการค้นหาสำหรับชื่อเก่า
  3. ห้ามเปลี่ยนชื่อดัชนีเชิงพื้นที่ ไม่แน่ใจว่าสิ่งนี้สำคัญหรือไม่เพราะทริกเกอร์ยังคงอ้างถึงชื่อดัชนีเก่า

เมื่อคุณเลือกการบำรุงรักษา→เปลี่ยนชื่อตารางใน SpatiaLite-GUI คุณเพิ่งได้สตับของALTER TABLEคำสั่งSQL นี่คือ SQL ที่ตรงไปตรงมาและทำได้น้อยกว่า QGIS DB Manager หากคุณกรอกชื่อตารางใหม่ตารางจะถูกเปลี่ยนชื่อ ผลกระทบอื่น ๆ :

  1. ตารางไม่ได้รับการเปลี่ยนชื่อgeometry_columns.f_table_nameซึ่งหมายความว่า GIS จำนวนมากจะไม่เห็นตารางเป็นเลเยอร์เชิงพื้นที่
  2. ห้ามเปลี่ยนชื่อทริกเกอร์ นิยามทริกเกอร์ที่มีการแก้ไขบางส่วนเพื่อให้BEFORE [INSERT|UPDATE|DELETE]หมายถึงชื่อตารางใหม่ geometry_columnsแต่ยังคงสภาพการค้นหาสำหรับชื่อเก่า
  3. ห้ามเปลี่ยนชื่อดัชนีเชิงพื้นที่ ไม่แน่ใจว่าสิ่งนี้สำคัญหรือไม่เพราะทริกเกอร์ยังคงอ้างถึงชื่อดัชนีเก่า

โปรดทราบว่า Spatialite-GUI ให้ตัวเลือกในการกู้คืนคอลัมน์รูปทรงเรขาคณิตซึ่งเพิ่มรายการที่ถูกต้องgeometry_columns(แต่คุณต้องระบุ SRID, ประเภทรูปทรงเรขาคณิตและขนาด) เพื่อสร้างหรือสร้างดัชนีเชิงพื้นที่และกู้ทริกเกอร์ แต่ไม่มี ของฟังก์ชั่นเหล่านี้ลบแถวตารางทริกเกอร์หรือดัชนีเก่าที่นำไปสู่ ​​DB ที่มี schmutz (อาจไม่เป็นอันตราย แต่น่ารำคาญ) จำนวนมากในนั้น


3
ฉันคิดว่ามีความจำเป็นอย่างยิ่งสำหรับ "Table Manager" สำหรับการจัดเรียงใหม่เปลี่ยนชื่อลบฟิลด์อื่น ๆ ใน SpatiaLite ถ้าเราต้องการกำจัดไฟล์รูปร่าง แต่ด้วยเหตุผลที่ไม่รู้จักไม่มีเครื่องมือดังกล่าวที่จะช่วยเราได้เท่าที่ฉันรู้ อาจจะเป็นโครงการที่ดีสำหรับโครงการระดมทุนฝูงชน!
Bernd V.

คุณมี spatialite-gui รุ่นใด?
30184

SpatiaLite-GUI 1.7.1
Lee Hachadoorian

คำตอบ:


2

คุณต้องคัดลอกตารางด้วยชื่อตารางใหม่และเปลี่ยนชื่อคอลัมน์เมื่อคุณคัดลอกข้อมูล ฟังก์ชันตัวจัดการตารางจะเหมาะอย่างยิ่งสำหรับสิ่งนี้ แต่ยังไม่ได้ถูกสร้างสำหรับ gui เลย ลิงค์ด้านล่างแสดงข้อมูลที่เป็นทางการสำหรับสิ่งนี้พร้อมโค้ดตัวอย่างใน SQLite SpatiaLite เป็นส่วนหนึ่งของ SQLite ดังนั้นการเขียนโค้ดจึงเหมือนกัน โชคดี!

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


โปรดทราบว่าคำถามที่เป็นเรื่องเกี่ยวกับการเปลี่ยนชื่อตารางไม่คอลัมน์ หน้าเชื่อมโยงกล่าวถึงALTER TABLEคำสั่ง แต่คำถามที่อยู่แล้วทำไมนี้ไม่เพียงพอสำหรับฐานข้อมูลเชิงพื้นที่
Lee Hachadoorian

หลังจากดูสิ่งนี้ต่อไปพร้อมกับความคิดเห็นของคุณในใจฉันไม่คิดว่ามีวิธีที่เพียงพอในการทำเช่นนี้และรักษาทริกเกอร์และส่วนประกอบโครงสร้างอื่น ๆ ดูเหมือนว่าคุณจะต้องเขียนรหัสใหม่หรือเมื่อคุณส่งออกตาราง (ถ้าคุณวางแผนที่จะทำเช่นนั้น) ให้ใช้ชื่ออื่นใน db manager ใน QGIS
Julia
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.