Archivio di March 2006

Query di INSERT in MySQL Server (SQL)

Prima di partire per un giro nella “tranquilla” :-) Parigi scrivo breve articolo per spiegare diverse modalità  con cui scrivere query di INSERT in mysql e in generale con il linguaggio SQL.
Per inserire i dati in mysql abbiamo sostanzialmente tre possibili differenti sintassi in
INSERT.

Di seguito vi allego la sintassi come da manuale:

INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)]
VALUES ({expr | DEFAULT},…),(…),…
[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
Or:
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name
SET col_name={expr | DEFAULT}, …
[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
Or:
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)]
SELECT …

Semplificando quanto fornito dal manuale di mysql vediamo insieme il funzionamento
di INSERT con degli esempi pratici che andrete ad eseguire sul nostro progettino:

Prendiamo per esempio una tabella con campi:
IDfornitore (PK) auto incrementale
fornitore varchar (200)
INSERT INTO fornitore VALUES (”, ‘Eforhum.it’);

Attenzione: in mysql 5 usare la seguente sintassi:

INSERT INTO fornitore VALUES (NULL, ‘Eforhum.it’);

Questo perchè mysql 5 non accetta più valori per la chiave primaria autoincrement numerica passati come ” dove si intende valore presente ma blank, vuole assolutamente NULL, ovvero valore NON presente.

Sostanzialmente utilizzando questa sintassi possiamo dire che la query “passa†alla
tabella “fornitore†i valori da inserire in ordine di campo.

Il vantaggi di usare questa sintassi di INSERT sono:

VANTAGGI:
1. Velocità  di esecuzione
2. SQL molto scarno e rapido da scrivere

SVANTAGGI:
1. Bisogna conoscere molto bene i campi della tabella e l’ordine in cui sono messi
2. In caso di modifiche al DB bisogna sistemare subito le query
3. Lettura della query abbastanza difficile

INSERT INTO fornitore (IDfornitore, fornitore) VALUES (”, ‘Eforhum.it’);

Come possiamo notare che l’unica cosa che cambia è la definizione dell’ordine dei
campi in cui mysql inserirà  i valori.

VANTAGGI:
1. Buona velocità  di esecuzione delle query
2. In caso di modifiche al DB (anche se è fondamentale aggiornare le query) non si
rischia di incorrere in inserimenti errati. Stesso discorso vale per l’ordine dei campi
che se cambia non inficia sulla validità  della query.

SVANTAGGI:
1. Non di facile lettura

INSERT INTO fornitore SET fornitore = ‘eforhum.it’;
Con questa sintassi possiamo notare che vengono associati campo = valore

VANTAGGI:
1. Se viene cambiato il DB o l’ordine dei campi le query non portano ad errori di
inserimento (a meno che non si siano eliminate delle colonne)
2. Facilità  di lettura SQL di INSERT

SVANTAGGI:
1. SQL forse un pà ridondante
Approfondite le varie sintassi possiamo facilmente dedurre che la soluzione migliore è
di utilizzare l’SQL di INSERT che prevete il setting di campi = valore, questo sia per
facilità  di lettura che per leggibilità  dell’SQL.
Infatti se immaginiamo una tabella di 30/40 campi le prime due opzioni non
garantiscono una facile lettura per l’individuazione di eventuali errori.

Ciao a tutti, Maxgrante
info[AT]massimo-caselli[DOT]com

Ubuntu: Attivazione repository universe

Buongiorno a tutti,
pubblico articolo scritto a suo tempo per Openskills sull’attivazione dei repository universe con Ubuntu.
Per poter sfruttare appieno il fantastico sistema di update e installazione pacchetti che è apt-get su Ubuntu bisogna attivare i repository “universe” che risultano essere di default commentati.

Di seguito un esempio del file dei repository /etc/apt/sources.list e descrizione delle righe da decommentare:

deb cdrom:[Ubuntu 5.04 _Hoary Hedgehog_ - Preview i386 Binary-1 (20050310)]/ hoary main restricted

deb http://it.archive.ubuntu.com/ubuntu hoary main restricted
deb-src http://it.archive.ubuntu.com/ubuntu hoary main restricted

## Uncomment the following two lines to fetch major bug fix updates produced
## after the final release of the distribution.
# deb http://it.archive.ubuntu.com/ubuntu hoary-updates main restricted
# deb-src http://it.archive.ubuntu.com/ubuntu hoary-updates main restricted

## Uncomment the following two lines to add software from the ‘universe’
## repository.
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## universe WILL NOT receive any review or updates from the Ubuntu security
## team.
#deb http://it.archive.ubuntu.com/ubuntu hoary universe
#deb-src http://it.archive.ubuntu.com/ubuntu hoary universe

#deb http://security.ubuntu.com/ubuntu hoary-security main restricted
#deb-src http://security.ubuntu.com/ubuntu hoary-security main restricted

#deb http://security.ubuntu.com/ubuntu hoary-security universe
#deb-src http://security.ubuntu.com/ubuntu hoary-security universe

Bisogna scommentare quindi tutte le righe al di sotto della nota scritta dal team di Ubuntu.
Come possiamo notare Ubuntu per motivi di copyright non supporta direttamente i pacchetti presenti nel repository universe, ad ogni modo l’aggiornamento degli stessi è comunque sempre ampiamente garantito dalla comunità .

Nota: per installazione di tipo server, soprattutto per servizi pubblici è consigliabile utilizzare solo i repository ufficiali.

Ora con il vostro fido apt-get potete installare una grande quantità  di pacchetti.

Articolo originale scritto sempre da me su:

http://openskills.info/infobox.php?ID=1255

Ciao. Maxgrante
info[AT]massimo-caselli[dot]com

Concetto di Chiave Primaria

Scrivo un breve articolo per utenti non esperti per chiarire il concetto di chiave primaria.

Una relazione, prendiamo ad esempio 1:n, si realizza quando la chiave primaria della tabella1 è riportata come chiave esterna nella tabella2.
Per ogni unica chiave primaria possono corrispondere infiniti riferimenti ad essa nella tabella2, come chiave esterna.

Approfondiamo quindi il concetto di chiave primaria:

Lo scopo di una chiave primaria è quello di individuare con la massima rapidità  possibile un dato record all’interno di una tabella in modo univoco.

Ad esempio per trovare il record numero 484892 all’interno di una tabella da milioni di record.

Tale operazione avviene di fatto ogni volta che bisogna andare a recuperare i dati presenti in un’altra tabella, attività  che su un database relazionale viene utilizzata molto frequentemente.

Una chiave primaria sulla maggior parte dei DBMS puà essere impostata come numerico, numerico auto incrementale, testuale, su più campi di vari formati etc…
Il fatto importante è che la chiave primaria di una tabella rispetti le seguenti affermazioni:

La chiave primaria DEVE essere univoca all’interno della tabella, infatti non è possibile che due record abbiano la stessa chiave primaria.

La chiave primaria deve avere come requisito (non obbligatorio ma di buon senso) la compattezza:

1.Essendo fondamentale per mantenere un indice primario, con lo scopo di velocizzare la ricerca.
Maggiore è la compattezza del campo che descrive la chiave primaria della tabella e più efficace sarà  la gestione di questo indice.
Se ne evince chiaramente che una chiave primaria intera (numerica) è tendenzialmente meglio ottimizzata rispetto ad un campo stringa a lunghezza variabile.

2.Essendo il contenuto della chiave primaria utilizzato in qualità  di chiave esterna in altre tabelle è chiaro che se la chiave primaria non è compatta cià comporta uno spreco di spazio occupato dal database.

La chiave primaria nei principali DBMS viene utilizzata di solito come dato numerico e con la proprietà  di essere automaticamente incrementato dal database all’inserimento di ogni nuovo record.
In questo modo lo sviluppatore e l’utente non devono preoccuparsi di gestire la chiave primaria e quindi di dover preoccuparsi che essa non sia già  presente.

Rischio di duplicati

Un facile esempio in cui una chiave primaria numerica autoincrementale puà comportare la creazione di duplicati è data per esempio dall’anagrafica di una società .
Infatti se l’amministrazione non è attenta a verificare che una data azienda è già  presente a database il rischio è di ritrovarsi 8 Telecom, 5 Enel etc…

Questa situazione è molto pericolosa sia perchè comporta uno spreco di dati e ridondanza di informazioni e sia perchè rende poco consistenti e validi i dati nel caso ad esempio di reportistiche e statistiche, questo perchè la stessa società  verrebbe (giustamente) trattata dal database come differenti aziende.

Saluti, Maxgrante
info[AT]massimo-caselli[DOT]com

Seminario gratuito: Linux Administrator, presente e futuro

Ciao a tutti,
Coresis nella persona di Alessandro Franceschi organizza seminario gratuito in data [CORREZIONE] 25 Marzo 2006 presso la sede di Eforhum di Milano.

Per maggiori informazioni e iscrizioni:

http://www.coresis.com/training/eventi-seminariolad.php

Ciao a tutti, Maxgrante
info[AT]massimo-caselli[DOT]com

Esportazione da PHP in formato Excel

Ciao a tutti,
oggi vediamo come creare facilmente un foglio excel / calc di Openoffice mediante l’utilizzo di php.
Per farlo senza alcuna difficolta sfruttiamo la capacità  di Excel di leggere file HTML.

In sostanza tutto quello che dobbiamo fare è creare una semplice tabella HTML di 2 righe e quante colonne ci servono, la prima indica il contenuto del campo, la seconda riga la usiamo per farla ciclare con i dati estratti da php.

Una volta ottenuta in HTML la tabella con i dati desiderati basta semplicemente anteporre al nostro script le seguenti righe PHP:

< ?php
$nomefile=$_GET['nomefile']".xls";
header ("Content-Type: application/vnd.ms-excel");
header ("Content-Disposition: inline; filename=$nomefile");
?>

In sostanza basta passare per comodità  al nostro script il nome del file, ad esempio:

http://www.miosito.com/export-excel.php?nomefile=esportazione

A questo punto automaticamente ci verrà  proposto dal browser di salvare un file di nome esportazione.xls con i dati contenuti all’interno della tabella HTML precedentemente visualizzata.

Strano ma vero… è tutto qui…
Ciao. Maxgrante
info[AT]massimo-caselli[DOT]com