Cosa ti serve
- La cartella
database/mysql/del pacchetto, con tre file:schema.sql(solo la struttura),data.sql(solo i dati) efull.sql(tutto insieme). Nella demo gratuita i dump non ci sono: la demo è in Excel, CSV e JSON. - MySQL 8 o MariaDB, con il client a riga di comando
mysql, oppure un client grafico come MySQL Workbench, DBeaver o phpMyAdmin. - Un utente con il permesso di creare tabelle nel database di destinazione.
Un database vuoto
I dump non creano il database: creano le tabelle dentro quello che scegli. Crealo con la codifica giusta, la stessa del pacchetto:
CREATE DATABASE comuni CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Puoi anche importare in un database che usi già: i nomi delle tabelle iniziano tutti con data_ e non entrano in conflitto con le tue.
Importare full.sql
Dalla riga di comando, dalla cartella del pacchetto:
mysql -u utente -p comuni < database/mysql/full.sql
Il file comincia con DROP TABLE IF EXISTS per ogni tabella e poi la ricrea: puoi lanciarlo quante volte vuoi, ottieni sempre lo stato del rilascio. Le chiavi esterne vengono dichiarate nello schema e i controlli restano sospesi durante l'inserimento, come fa mysqldump, così l'ordine delle tabelle non importa.
Con un client grafico apri full.sql ed eseguilo sul database comuni. phpMyAdmin ha un limite sulla dimensione del file caricato: se lo rifiuta, usa la riga di comando o importa prima schema.sql e poi data.sql, che sono gli stessi dati in due file.
Controllare che sia andata bene
Confronta le righe con i totali che il rilascio dichiara in CHANGELOG.md, tabella per tabella:
SELECT 'data_comuni' AS tabella, COUNT(*) AS righe FROM data_comuni
UNION ALL SELECT 'data_comuni_cap', COUNT(*) FROM data_comuni_cap
UNION ALL SELECT 'data_province', COUNT(*) FROM data_province
UNION ALL SELECT 'data_regioni', COUNT(*) FROM data_regioni;
manifest.json ha la stessa informazione per i file CSV e JSON, con l'impronta SHA-256 di ogni file.
Le prime query
I CAP di un comune, uno per riga anche nelle città che ne hanno molti:
SELECT c.nome, k.cap
FROM data_comuni c
JOIN data_comuni_cap k ON k.comune_istat = c.istat
WHERE c.nome = 'Jesolo'
ORDER BY k.cap;
I comuni di una provincia con la popolazione, dalla sigla:
SELECT c.nome, p.popolazione_totale
FROM data_comuni c
JOIN data_province pr ON pr.istat = c.provincia_istat
JOIN data_comuni_popolazione p ON p.comune_istat = c.istat
WHERE pr.sigla = 'LI'
ORDER BY p.popolazione_totale DESC;
Il comune a partire da un CAP, con la sua provincia:
SELECT c.nome, c.istat_testo, pr.sigla
FROM data_comuni_cap k
JOIN data_comuni c ON c.istat = k.comune_istat
JOIN data_province pr ON pr.istat = c.provincia_istat
WHERE k.cap = '30017';
I comuni confinanti di un comune: la tabella ha ogni coppia nei due versi, quindi basta una direzione.
SELECT v.nome
FROM data_comuni c
JOIN data_comuni_confinanti cf ON cf.comune_istat = c.istat
JOIN data_comuni v ON v.istat = cf.confinante_istat
WHERE c.nome = 'Livorno'
ORDER BY v.nome;
Le chiavi da usare
istat è il codice ISTAT numerico ed è la chiave di tutto: comune_istat nelle tabelle satellite, provincia_istat e regione_istat verso l'alto. istat_testo è lo stesso codice a sei cifre con gli zeri, per chi deve confrontarlo con un file di testo. Il codice catastale sta in belfiore. Non usare il nome come chiave: viene corretto quando ISTAT corregge una grafia, il codice no.
Aggiornare al rilascio successivo
Rilancia full.sql del nuovo rilascio sullo stesso database: le tabelle vengono ricreate con i dati nuovi. Se hai viste, trigger o colonne tue aggiunte alle tabelle del pacchetto, tienile in tabelle separate collegate per istat, così un aggiornamento non le tocca. Il registro degli aggiornamenti sul sito e CHANGELOG.md dicono quali comuni e quali CAP sono cambiati, se vuoi aggiornare solo quelli a mano.