Visualizzazione post con etichetta mysql. Mostra tutti i post
Visualizzazione post con etichetta mysql. Mostra tutti i post

martedì 9 febbraio 2010

MySQL: Generare una chiave primaria per una tabella (versione migliorata)


Ciao a tutti,

l'altro giorno avendo un po' di tempo per sperimentare nuove e più comode soluzioni, sono voluto ritornare su un argomento che avevo trattato qualche mese fa in questo post, la generazione di una chiave primaria per le tabelle MySQL.

Siccome l'altra volta avevamo trattato una soluzione veloce, quindi non troppo elegante, per la gestione del problema ho ripensato alla cosa ed ho trovato che la cosa migliore fosse integrare il codice in una funzione, comodamente richiamabile, in qualsiasi punto del codice, e standardizzata.

Allego quindi il codice di creazione della procedura:
CREATE DEFINER=`root`@`localhost` FUNCTION `RowIdGen`() RETURNS CHAR(30) CHARSET latin1
DETERMINISTIC
BEGIN
RETURN CONCAT('PREF',DATE_FORMAT(SYSDATE(),'%Y%m%d%H%i%s'),LPAD(FLOOR(1 + RAND() * 999999),7,0),LPAD(@numero := IFNULL(@numero,0) + 1,5,0));
END$$

DELIMITER ;
Non sto a ridiscutere il codice in quanto è già spiegato nel dettaglio nel vecchio post.
Spero di esservi stato utile, e se avete voglia cliccate sui banner pubblicitari.

Ciao

Wsc

giovedì 2 aprile 2009

MySQL: Generare una chiave primaria per una tabella

Oggi ho avuto la necessità di generare una chiave primaria per una tabella. Siccome non ho molto in simpatia l'uso degli autoincrement ho deciso di costruirla sulla base di un campo varchar(30).

Una delle problematiche è che in una fase di insert massivo (il sistema riesce ad inserire alcune migliaia di record in un secondo) la generazione di questa stringa non è stata semplicissima.
Vediamo comunque le strategie usate partendo dal risultato finale.
SET @numero = 1;

SELECT CONCAT('DVBH',DATE_FORMAT(NOW(),'%Y%m%d%H%i%s'),LPAD(FLOOR(1 + RAND() * 999999),7,0),LPAD(@numero := @numero + 1,5,0)) AS RecordId
Leggendo così a primo colpo può quasi spaventare, ma vediamola passo passo.
La Set iniziale servirà più avanti e per ora evito di trattarla.
Innanzi tutto per ottenere una stringa avremo bisogno ci concatenare gli elementi che useremo per andare a formare la stringa.
SELECT CONCAT('DVBH',DATE_FORMAT(NOW(),'%Y%m%d%H%i%s'),LPAD(FLOOR(1 + RAND() * 999999),7,0),LPAD(@numero := @numero + 1,5,0)) AS RecordId
Come primo elemento aggiungiamo un prefisso (in questo caso di 4 lettere) che ci identifica la tabella o qualsiasi altra cosa vi possa venire in mente.
SELECT CONCAT('DVBH',DATE_FORMAT(NOW(),'%Y%m%d%H%i%s'),LPAD(FLOOR(1 + RAND() * 999999),7,0),LPAD(@numero := @numero + 1,5,0)) AS RecordId
Per la seconda parte utilizziamo la data attuale con precisione al secondo in tale maniera ogni volta che creeremo la chiave primaria si già diversa in dipendenza del tempo.
SELECT CONCAT('DVBH',DATE_FORMAT(NOW(),'%Y%m%d%H%i%s'),LPAD(FLOOR(1 + RAND() * 999999),7,0),LPAD(@numero := @numero + 1,5,0)) AS RecordId
A questo punto siccome in un secondo possono esserci anche migliaia di inserimenti che manderebbero in violazione di chiave la nostra operazione aggiungiamo il terzo e quarto elemento. Il terzo sarò un numero randomico generato come già spiegato in un latro post secondo una formula matematica.
SELECT CONCAT('DVBH',DATE_FORMAT(NOW(),'%Y%m%d%H%i%s'),LPAD(FLOOR(1 + RAND() * 999999),7,0),LPAD(@numero := @numero + 1,5,0)) AS RecordId
Ultima parte un numero sequenziale, che io nel caso gli ho passato da una variabile @numero, ma che si può tranquillamente immagazzinare in una tabella e richiamare a piacere, aumentando il suo valore ad ogni passaggio.
SELECT CONCAT('DVBH',DATE_FORMAT(NOW(),'%Y%m%d%H%i%s'),LPAD(FLOOR(1 + RAND() * 999999),7,0),LPAD(@numero := @numero + 1,5,0)) AS RecordId
Il risultato che si ottiene è qualcosa come questo:
DVBH20090402133508062740800002
Ecco fatto!

Wsc

mercoledì 18 marzo 2009

MySQL: Generare numeri casuali in un intervallo

L'altro giorno mi sono imbattuto nella necessità di rielaborare dei dati creando un dataset simile ma rielaborando secondo funzioni statistiche dei campi numerici.

Avendo precedentemente calcolato Media e Varianza di questo set di dati (funzioni AVG() e STD()) quello che si desiderava fare era:
Media + (NumeroRandom * Varianza)
così facendo si sarebbe lavorato sulla media dei valori aggiungendogli una deviazione fornita dal numero randomico (compreso tra -0,8 e 0,8) moltiplicato la varianza.

L'inica funzione MySQL che genera numeri casuali è RAND(), però questa funzione produce numeri in virgola mobile compresi tra 0 e 1.
La sola funzione non riusciva a risolvere la problematica, quindi andava ulteriormente elaborata.
Googlando ho trovato per ottenere un numero intero variabile in un intervallo, mettiamo 1 e 3, si può applicare la seguente formula dove 1=i e 3=j:
FLOOR(i + RAND() * (j – i))
La formula di venta:
FLOOR(1 + RAND() * 2)
A questo punto non è stato necessario altro che effettuare una sostituzione per ottenere la formula finale dell'intervallo a cui ero interessato:
CEILING(Media + (-0.8 + (RAND() * 1.6)) * Varianza)
Ho usato il CEILING() in quanto a mi serviva arrotondare all'intero superiore contrariamente al FLOOR().
Spero che questo piccolo promemoria possa essere utile ad altri. Continuate a seguirmi.

Wsc

martedì 17 febbraio 2009

Iniziamo a vedere gli argomenti dell'esame Certified MySQL 5.0 Developer Part II

Inizio il nuovo per corso per completare la mia certificazione di Sviluppatore MySQL.

Gli argomenti della seconda parte dell'esame saranno i seguenti:
  1. Joins
  2. Subqueries
  3. Views
  4. Importing and Exporting Data
  5. User Variables
  6. Prepared Statements
  7. Stored Procedures and Functions
  8. Triggers
  9. Obtaining Database Metadata
  10. Debugging MySQL Applications
  11. Basic Optimizations
Il percorso di questa seconda parte della certificazione è molto più interessante del precedente. Si avvicina molto di più ai concetti in uso giornalmente nel lavoro, ma questo vuol dire anche che il tutto andrà affrontato con maggiore impegno.

Mi do due mesi per la preparazione e l'obiettivo quindi sarà posto durante il mese di Maggio.
Ora quindi sotto con lo studio.

Buona giornata a tutti!

Wsc

martedì 10 febbraio 2009

Superato l'esame (Certified MySQL 5.0 Developer Part I)

Oggi era il grande giorno, rimettermi in gioco con un esame dopo 3 anni, e per fortuna è andato tutto bene.

Si ho passato l'esame! Minimo sforzo massima resa! Ho evitato figuracce con i colleghi e questo è già positivo visto lo spirito goliardico che ci pervade. Il prossimo obiettivo ovviamente è ora quello di terminare la certificazione nei prossimi mesi.

Parlando del test invece, anche se non si può dire molto, ci sono un sacco di disclosure in merito, devo ammettere che vanno veramente a cercare il pelo nell'uovo, su cose che si danno spesso per scontate nell'utilizzo giornaliero di MySQL.
Un consiglio è sicuramente quello di stare bene attenti ai test presenti nel libro di preparazione alla certificazione. Alcune domande sono presenti all'interno dei test e questo è un bell'aiuto. Almeno poi non ti mangi le mani quando non ti ricordi le risposte.

Inizia ora la preparazione alla Part II in modo da chiudere questo primo percorso di certificazione in tempi brevi (speriamo prima dell'estate)!

Un saluto a tutti del vostro Half Certified MySQL Developer!

Wsc

venerdì 6 febbraio 2009

Weekend di ripasso (Certified MySQL 5.0 Developer Part I)

E siamo al weekend che precede l'esame.
Gli ultimi ripassi e un po' dei test messi a disposizione sui testi di studio da MySQL.

L'obiettivo da superare è fare meglio di 44 domande esatte su 70 in 90 minuti. Per ora le medie sui test sono intorno all'80%.
E' la prima sfida e va vinta. Impegno massimo. Nel weekend rivedrò quelle cose che più mi sfuggono perchè di uso non comune o date per scontate.
Superato questo scoglio si dovrà fare le giuste pressioni per chiudere la certificazione come Developer.

Poi un po' di studio sulle nuove funzionalità offerte dalla 5.1 ancora in fase di sviluppo, ma che a breve offriranno stabilità e nuovi metodi per affrontare le nuove problematiche della Data Consolidation.
Conoscere e poter utilizzare nuovi strumenti per la gestione di database com migliaia di tabelle e milioni di record per tabelle può essere vitale!
Credo che il partitioning sarà uno dei primi argomenti da affrontare ed approfondire.

Buon weekend a tutti.

Wsc

mercoledì 4 febbraio 2009

Esame in vista! (Certified MySQL 5.0 Developer Part I)

Era dai tempi dell'università che non dovevo sostenere un esame. L'ultimo che avevo fatto è stato "Algoritmi e Strutture Dati" con quel dannato programma in C da realizzare, ma era ancora settembre 2005...



Ora dopo tre anni e mezzo mi ritrovo a iniziare il processo di Certificazione per MySQL.

Certified MySQL 5.0 Developer Part I

Devo ammettere di essere un attimo intimorito... si sono cose su cui lavoro tutti i santi giorni... però è diverso quando ti ritrovi una bella sfilza di domande e un tempo limite per dare le risposte corrette.

Intanto continua la preparazione, dopo 180 pagine di manuale, i test contenuti nel libro capitolo per capitolo.

Gli argomenti sono molto al di sotto di quello che faccio comunemente tutti i giorni, però sono quelle cose che dai per scontato e che risciano in qualche modo di fregarti, magari per scarsa attenzione nel trattarli.

Comunque sotto con lo studio il 10 febbraio è vicino!

Un saluto ai miei sparuti lettori.

Wsc