[Gfoss] Spatialite FOREIGN KEY in LOAD_SHAPEFILE

a.furieri a lqt.it a.furieri a lqt.it
Gio 22 Giu 2023 10:17:52 CEST


On Thu, 22 Jun 2023 09:52:26 +0200, Marco Guiducci via Gfoss wrote:
> Buongiorno,
> la funzione LOAD_SHAPEFILE non permette di creare una FK
> (probabilmente perché la tabella referenziata potrebbe non esistere
> ancora?)
> A quanto leggo SQlite non permette di creare una FK, dopo, con ALTER
> TABLE (1). (ottengo errore di sintassi)
> Se è così occorre creare una nuova tabella popolandola con la tabella
> creata dalla LOAD e creare, contestualmente la/le FK.
>
> Qualcuno mi conferma?
>

ciao Marco,

effettivamente la ALTER TABLE di SQLite presenta molte limitazioni
rispetto a quella che trovi su altri DBMS (primo tra tutti Postgres).

quello che dici e' corretto; e' possibile definire le PK e le FK
di una tavola solo al momento delle CREATE TABLE perche' la ALTER
TABLE non consente in alcun modo di intervenire a posteriori sulle
definizioni della PK e delle FK

da parte sua la ImportSHP() e' una funzione abbastanza rigida che
si limita a creare una tavola spatial con tutte le colonne che
trova nello Shapefile seguendo una logica di cieco automatismo.

quindi alla fine non hai alternative: se ti serve una Spatial
Table con dei vincoli relazionali FK/PK con ulteriori tavole
te le devi creare a mano per poi procedere al loro popolamento.

nota: in situazioni come queste puo' essere utile ricorrere
ai VirtualShape che trovi documentati qua:
https://www.gaia-gis.it/fossil/libspatialite/wiki?name=Virtual+Tables+(misc)

in sostanza ricorrendo al VirtualShape puoi leggere direttamente
lo Shapfile esterno senza caricarlo nel DB, cosa che ti permette
di popolare la "vera" tavola Spatial creata a mano con tutte le
sue PK/FK semplicemente con una sintassi come questa:

INSERT INTO my_real_table
SELECT a,b,c,d,....,x,y,z
FROM my_virtual_shape;

nota: per inciso questo ti consente anche di specificare
una eventuale WHERE per restringere le features da
importare.

una volta che hai compiuto l'operazione di trasferimento
dei dati poi dovrai semplicemente eliminare la
VirtualShape che non serve piu' a nulla:

DROP TABLE my_virtual_shape;

spero di esserti stato utile,

ciao Sandro


Maggiori informazioni sulla lista Gfoss