[Gfoss] Spatialite FOREIGN KEY in LOAD_SHAPEFILE

Marco Guiducci marco.guiducci a regione.toscana.it
Gio 22 Giu 2023 11:34:34 CEST


Il 22/06/2023 10:17, Alessandro Furieri via Gfoss ha scritto:
> 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
> _______________________________________________
>

grazie Sandro, questa storia della virtual non l'avevo presa in 
considerazione, forse solo per il nome. non padroneggiando ancora bene 
lo strumento ho bisogno di "certezze" :-) e il termine è un po' 
inflazionato negli ultimi tempi.
grazie ancora
procedo (anzi o già proceduto): la prima spatial view è nata. ora 
ridisfo tutto e riparto. devo mettere le FK su tutte le tabelle (il 
grafo regionale... che penso tu conosca!). mi domando perché non lo 
diamo già in sqlite "bell'e che fatto" direbbe qualcuno :-)
marco

-- 
Marco Guiducci 055 4383194
Regione Toscana - Settore Sistema Informativo e pianificazione del territorio



Maggiori informazioni sulla lista Gfoss