Informazioni sulle tabelle
Gli argomenti di questa pagina
|
Prima di iniziare
Innanzitutto verificare che esista il file che contiene i dati di connessione al DB.
In questo file verranno indicate le sole quattro variabili necessarie a stabilire la connessione al DB prima di compiere qualsiasi azione ed è questo file che includeremo in tutte le pagine che debbono lavorare col DB. Questi dati vengono forniti dall'host che abbiamo scelto per il nostro sito.
1
|
<?php
|
Questo che segue è un frammento di codice che sarà necesario per eseguire la connessione al DB ed alla esecuzione delle Query.
1
|
<?php
|
Se si apre una connessione a MySQL all'interno del file PHP è possibile chiuderla con la funzione mysql_close(). Anche se non tutti i programmatori usano chiudere esplicitamente la connessione perchè lo trovano inutile, in quanto le connessioni MySQL sono solitamente chiuse per default alla fine dello script, è buona norma fare in modo che tutte le risorse vengano liberate dopo l'utilizzo del DB, usando la funzione mysql_close(). Ciò assicurerà che la connessione venga chiusa nella linea esatta nello script in cui si dice di chiudere.
1
|
<?php
|
Notizie ed informazioni sugli oggetti di un DB
Prima di passare alle Query sui dati è bene mostrare come ottenere le informazioni sugli oggetti del DB in special modo:
- Elenco delle tabelle del DB
- Elenco dei campi delle tabelle
- Tipi di campi
- Numero dei record in una tabella
- Numero di record restituiti da una Query
Elenco delle tabelle in un DB: SHOW TABLES
La Query é semplice e, scritta come nell'esempio, restituisce un elenco completo delle tabelle presenti nel DB
1
|
<?php
|
Se non si desidera l'elenco completo delle tabelle presenti nel DB si può usare un filtro basato sull'operatore LIKE per limitare l'elenco alle sole tabelle che soddisfano il filtro specificato nell'operatore LIKE. Per esempio:
vogliamo un elenco delle tabelle che iniziano col prefisso sql_
e che sono quelle usate per questo tutorial. Ecco la Query modificata per soddisfare questa richiesta e quello sotto è il risultato:
La Query che useremo in questo esempio:
1
|
<?php
|
Lo script che verrà usato per l'esecuzione della Query non cambia dalla struttura degli altri script simili e, nell'esempio, esegue questa seconda Query.
1
|
<?php
|
In questo esempio vengono visualizzate le sole tabelle che iniziano col prefisso sql_.
sql_agenda
sql_articoli
sql_citta
sql_citta_2
sql_comuni
sql_comuni_full
sql_downloads
sql_lib_prestiti
sql_libri
sql_mag_acquisti
sql_mag_articoli
sql_mag_fornitori
sql_mag_vendita
sql_ore_lavorative
sql_province
sql_rubrica
sql_rubrica_indicizzata
sql_rubrica_nuova
Controllare se una tabella esiste
A volte prima di eseguire delle operazioni occorre sapere se una tabella esiste.
Per verificare l'esistenza di una tabella esistono diverse metodologie, ma quella basata sull'operatore LIKE forse è la più semplice. Nel filro che diamo all'operatore LIKE indichiamo il nome completo della tabella. Se la Query restituisce almeno una riga la tabella esiste, altrimenti non esiste.
Qui sotto un esempio per effettuare questa ricerca.
Ho preparato due Query:
nella prima Query nell'operatore LIKE ho indicato una tabella che sicuramente esiste
Nella seconda Query ho indicato una tabella che sicuramente NON esiste
1
|
<?php
|
Lo script usato è leggermente modificato rispetto a quelli standard. Siccome in questa circostanza mi interessa solo sapere se la tabella esiste, invece di fare tutti i passaggi dello script standard valorizzando la variabile $result, utile per altri usi, e controllando poi se la Query restituisce qualche riga (le due righe di uso standard sono commentate):
$result = mysql_query($Query);
if (mysql_num_rows($result)) {
eseguo il controllo comprimento in una unica riga le due istruzioni:
if (mysql_num_rows( mysql_query($Query))) {
1
|
<?php
|
Il risultato ovviamente è quello atteso: viene segnalato che la prima tabella esiste e che la seconda non è stata trovata. Questo controllo può evitare l'insorgere di errori o, addirittura, il blocco dello script, se viene lanciato uno script su una tabella inesistente.
La tabella una_tabella NON esiste!
Informazioni sulle tabelle del DB con INFORMATION_SCHEMA
INFORMATION_SCHEMA è un database virtuale che descrive la struttura di tutti gli altri database.
I valori che questa istruzione restituisce sono questi:
Proprietà | Valore |
---|---|
TABLE_CATALOG | normalmente NULL |
TABLE_SCHEMA | nome del DB |
TABLE_NAME | nome della tabella |
TABLE_TYPE | BASE TABLE o SYSTEM VIEW |
ENGINE | MySQL extension (MyISAM o MEMORY) |
VERSION | la versione della tabella (es: 10) |
ROW_FORMAT | normalmente Dynamic o Fixed |
TABLE_ROWS | numero di record |
AVG_ROW_LENGTH | MySQL extension |
DATA_LENGTH | dimensione in bytes dei dati |
MAX_DATA_LENGTH | MySQL extension |
INDEX_LENGTH | MySQL extension |
DATA_FREE | MySQL extension |
AUTO_INCREMENT | il valore massimo dell'indice autoincrementale |
CREATE_TIME | data di creazione |
UPDATE_TIME | ultimo aggiornamento |
CHECK_TIME | MySQL extension |
TABLE_COLLATION | codifica caratteri (latin1_swedish_ci, utf8_general_ci, ecc.) |
CHECKSUM | MySQL extension |
CREATE_OPTIONS | MySQL extension |
TABLE_COMMENT | MySQL extension |
Le proprietà più utili | |
TABLE_NAME | nome della tabella |
ENGINE | MySQL extension (MyISAM o MEMORY) |
TABLE_ROWS | numero di record |
DATA_LENGTH | dimensione in bytes dei dati |
AUTO_INCREMENT | il valore massimo dell'indice autoincrementale |
CREATE_TIME | data di creazione |
UPDATE_TIME | ultimo aggiornamento |
TABLE_COLLATION | codifica caratteri (latin1_swedish_ci, utf8_general_ci, ecc.) |
Query ed esecuzione per mostrare le informazioni sulle tabelle
Qui di seguito vediamo tre differenti Query per mostrare le informazioni disponibili per la tabella o le tabelle che andremo ad esaminare.
- prima Query: leggiamo solo alcune delle proprietà delle tabelle
- seconda Query: leggiamo le proprietà più significative nostrate nello schema qui sopra, quindi:
TABLE_NAME, ENGINE, TABLE_ROWS, DATA_LENGTH, AUTO_INCREMENT, CREATE_TIME, UPDATE_TIME, TABLE_COLLATION - terza Query: leggiamo tutte le proprità delle tabelle.
Qui di seguito vengono dati i risultati per le sole prime due Query. Nella terza Query, invece di specificare i campi che vogliamo vedere, viene utilizzato l'asterisco ( * ) per indicare che vogliamo avere le informazioni di tutti i campi che verranno restituiti.
Perciò, per questa terza Query, che è troppo corposa, diciamo che verrà usato lo stesso script che viene usato per le prime due, anche se nell'esempio di questa pagina non viene usata.
1
|
<?php
|
Per mandare in esecuzione lo script che segue le variabili $Query_1, $Query_2, $Query_3 saranno trasformate in $Query.
1
|
<?php
|
Nel risultato mostrato qui di seguito vedremo solo quel che viene restituito dalle prime due Query, ma è possibile vedere anche la terza mandando in esecuzione lo stesso script presentato qui sopra.
3 informazioni per 18 tabelle trovate | ||
---|---|---|
TABLE_NAME | TABLE_TYPE | ENGINE |
sql_agenda | BASE TABLE | MyISAM |
sql_articoli | BASE TABLE | MyISAM |
sql_citta | BASE TABLE | MyISAM |
sql_citta_2 | BASE TABLE | MyISAM |
sql_comuni | BASE TABLE | MyISAM |
sql_comuni_full | BASE TABLE | MyISAM |
sql_downloads | BASE TABLE | MyISAM |
sql_lib_prestiti | BASE TABLE | MyISAM |
sql_libri | BASE TABLE | MyISAM |
sql_mag_acquisti | BASE TABLE | MyISAM |
sql_mag_articoli | BASE TABLE | MyISAM |
sql_mag_fornitori | BASE TABLE | MyISAM |
sql_mag_vendita | BASE TABLE | MyISAM |
sql_ore_lavorative | BASE TABLE | MyISAM |
sql_province | BASE TABLE | MyISAM |
sql_rubrica | BASE TABLE | MyISAM |
sql_rubrica_indicizzata | BASE TABLE | MyISAM |
sql_rubrica_nuova | BASE TABLE | MyISAM |
8 informazioni per 18 tabelle trovate | |||||||
---|---|---|---|---|---|---|---|
TABLE_NAME | ENGINE | TABLE_ROWS | DATA_LENGTH | AUTO_INCREMENT | CREATE_TIME | UPDATE_TIME | TABLE_COLLATION |
sql_agenda | MyISAM | 103 | 6192 | 104 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 | utf8_general_ci |
sql_articoli | MyISAM | 30 | 8372 | 31 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 | utf8_general_ci |
sql_citta | MyISAM | 38 | 1160 | 163 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 | utf8_general_ci |
sql_citta_2 | MyISAM | 0 | 0 | 1 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 | utf8_general_ci |
sql_comuni | MyISAM | 14701 | 465512 | 14702 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 | utf8_general_ci |
sql_comuni_full | MyISAM | 14701 | 583688 | 14702 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 | utf8_general_ci |
sql_downloads | MyISAM | 2 | 92 | 3 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 | utf8_general_ci |
sql_lib_prestiti | MyISAM | 10 | 190 | 11 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 | utf8_general_ci |
sql_libri | MyISAM | 22 | 1524 | 23 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 | utf8_general_ci |
sql_mag_acquisti | MyISAM | 9 | 243 | 11 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 | utf8_general_ci |
sql_mag_articoli | MyISAM | 8 | 388 | 9 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 | utf8_general_ci |
sql_mag_fornitori | MyISAM | 8 | 296 | 9 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 | utf8_general_ci |
sql_mag_vendita | MyISAM | 3 | 100 | 4 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 | utf8_general_ci |
sql_ore_lavorative | MyISAM | 8 | 396 | 9 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 | utf8_general_ci |
sql_province | MyISAM | 110 | 2404 | 111 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 | utf8_general_ci |
sql_rubrica | MyISAM | 101 | 9188 | 102 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 | utf8_general_ci |
sql_rubrica_indicizzata | MyISAM | 101 | 9116 | 102 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 | utf8_general_ci |
sql_rubrica_nuova | MyISAM | 105 | 10448 | 106 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 | utf8_general_ci |
Informazioni sulle tabelle del DB con SHOW TABLE STATUS
Altro modo di ottenere informazioni simili è quello di usare SHOW TABLE STATUS. Le informazioni restituite sono quasi come quelle restituite da INFORMATION_SCHEMA appena visto. Eccone un elenco dettagliato.
Name | Nome della tabella |
Engine | Il motore di memorizzazione per la tabella |
Version | Il Numero della versione del file .frm relativo alla tabella |
Row_format | Il formato di righe di archiviazione (Fisso, Dynamic, compresso, ridondante, Compact) |
Rows | Il numero di record |
Avg_row_length | La lunghezza media delle righe |
Data_length | La dimensione del file dei dati |
Max_data_length | La lunghezza massima del file di dati. Questo è il numero totale di byte di dati che possono essere memorizzati nella tabella, date le dimensioni del puntatore dati utilizzata. |
Index_length | La dimensione del file indice |
Data_free | Il numero di byte allocati ma non utilizzati |
Auto_increment | Il prossimo valore AUTO_INCREMENT |
Create_time | Data della creazione della tabella |
Update_time | Ultimo aggiornamento della tabella |
Check_time | Ultimo accesso alla tabella. Non tutti i motori di archiviazione aggiornano questo argomento, nel qual caso il valore è NULL |
Collation | Tipo di collation della tabella |
Checksum | Il valore di checksum dal vivo (se presente) |
Create_options | Opzioni Extra usati con CREATE TABLE. Le opzioni originali forniti quando CREATE TABLE viene chiamato vengono mantenute e le opzioni qui riportati potrebbero differire dalle impostazioni della tabella attive e opzioni |
Comment | I commenti usati durante la creazione della tabella |
Vediamo come fare.
La Query da creare è la seguente:
1
|
<?php
|
Questa, purtroppo, produce un numero eccessivo di informazioni che è difficile da gestire se, come nell'esempio sopra indicato, volessimo ridurre. Per risolvere ho creato una matrice prendendo dal recordset prodotto solo le chiavi che mi interessano, come è visibile nell'Array qui sotto.
1
|
<?php
|
Fatto questo posso usare questo script che è simile a tutti gli altri usati per leggere un recordset ma che come campi non prende quelli generati dalla Query, ma quello da me preparato.
1
|
<?php
|
Questo è quel che vien fuori:
8 informazioni per 18 tabelle trovate | |||||||
---|---|---|---|---|---|---|---|
Name | Engine | Collation | Rows | Auto_increment | Data_length | Create_time | Update_time |
sql_agenda | MyISAM | utf8_general_ci | 103 | 104 | 6192 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 |
sql_articoli | MyISAM | utf8_general_ci | 30 | 31 | 8372 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 |
sql_citta | MyISAM | utf8_general_ci | 38 | 163 | 1160 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 |
sql_citta_2 | MyISAM | utf8_general_ci | 0 | 1 | 0 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 |
sql_comuni | MyISAM | utf8_general_ci | 14701 | 14702 | 465512 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 |
sql_comuni_full | MyISAM | utf8_general_ci | 14701 | 14702 | 583688 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 |
sql_downloads | MyISAM | utf8_general_ci | 2 | 3 | 92 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 |
sql_lib_prestiti | MyISAM | utf8_general_ci | 10 | 11 | 190 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 |
sql_libri | MyISAM | utf8_general_ci | 22 | 23 | 1524 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 |
sql_mag_acquisti | MyISAM | utf8_general_ci | 9 | 11 | 243 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 |
sql_mag_articoli | MyISAM | utf8_general_ci | 8 | 9 | 388 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 |
sql_mag_fornitori | MyISAM | utf8_general_ci | 8 | 9 | 296 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 |
sql_mag_vendita | MyISAM | utf8_general_ci | 3 | 4 | 100 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 |
sql_ore_lavorative | MyISAM | utf8_general_ci | 8 | 9 | 396 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 |
sql_province | MyISAM | utf8_general_ci | 110 | 111 | 2404 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 |
sql_rubrica | MyISAM | utf8_general_ci | 101 | 102 | 9188 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 |
sql_rubrica_indicizzata | MyISAM | utf8_general_ci | 101 | 102 | 9116 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 |
sql_rubrica_nuova | MyISAM | utf8_general_ci | 105 | 106 | 10448 | 2021-08-12 20:24:23 | 2021-08-12 20:24:23 |
Differenze tra INFORMATION_SCHEMA e SHOW TABLE STATUS
Le differenze del numero e dei tipi di proprietà tra i due metodi dono questi qui sotto elencati
Con la Query INFORMATION_SCHEMA | Con la Query SHOW TABLE STATUS |
---|---|
TABLE_CATALOG | Name |
TABLE_SCHEMA | Engine |
TABLE_NAME | Version |
TABLE_TYPE | Row_format |
ENGINE | Rows |
VERSION | Avg_row_length |
ROW_FORMAT | Data_length |
TABLE_ROWS | Max_data_length |
AVG_ROW_LENGTH | Index_length |
DATA_LENGTH | Data_free |
MAX_DATA_LENGTH | Auto_increment |
INDEX_LENGTH | Create_time |
DATA_FREE | Update_time |
AUTO_INCREMENT | Check_time |
CREATE_TIME | Collation |
UPDATE_TIME | Checksum |
CHECK_TIME | Create_options |
TABLE_COLLATION | Comment |
CHECKSUM | |
CREATE_OPTIONS | |
TABLE_COMMENT |