Trovare ed eliminare record (semi-)duplicati in SQL
Lo ammetto: non é certo la cosa più complicata del mondo eliminare le righe duplicate in un database; quando serve però non viene mai in mente un modo per farlo.
Questo post lo categorizzo quindi come mio promemoria!
Perché (semi-)duplicati?
Parto dall’esempio pratico: aggiungere una chiave ad una tabella già piena di dati.
Ovviamente, per la legge di Murphy, i valori dei campi che dovrebbero diventare chiave non saranno mai tutti diversi. Voglio quindi eliminare dalla tabella i record con chiavi uguali, preservandone solo una copia per ognuno.
Poniamo che la nostra tabella di chiami table1 con campi field1,field2,field3 (la fantasia nel dare i nomi é il mio forte). Vogliamo far diventare field1 e field2 chiave primaria. Per eliminare i duplicati eseguiamo:
SELECT *
FROM db.table1 as t2
WHERE (t2.field1,t2.field2,t2.field3) not in (
SELECT t1.field1,t1.field2, min(t1.field3)
FROM db.table1 as t1
group by t1.field1,t1.field2)
Fatto! Come preannunciato niente di emozionante…
Ovviamente la regola min(t1.field3) puo’ essere cambiata a piacimento per conservare il record piu’ conveniente ai fini dell’applicazione.
Le armi nascoste di Vim
Certo che non si finisce mai di imparare… dopo quasi 10 anni di utilizzo scopro solo oggi che Vim può editare direttamente file anche via ftp, scp, rcp!!
vim ftp://user@server/directory/file
Storage USB e mount point
Problema: come tutti ormai vivo con quantità abnormi di dati memorizzate su dispositivi usb esterni. Come fare per avere questi dati sempre a disposizione sullo stesso “mount point” in linux?
Soluzione: ci sono 2 possibilità; la prima é quella di editare i files di regole di udev (ormai tutte le distribuzioni lo utilizzano) in modo da identificare il dispositivo hardware e assegnargli cosi’ un nome unico all’interno dello pseudo filesystem “dev”. Una volta ottenuto questo non resta che inserire in fstab la riga corretta per il montaggio del filesystem. Non é nulla di particolarmente complicato ma, come dicevo, c’é un’altra soluzione che é ancora piu’ semplice.
Quasi tutte le distribuzioni moderne hanno abilitata la funzione di automount dei dispositivi usb; bene, il punto di mount utilizzato in maniera predefinita é la “label” del filesystem che deve essere montato (se presente). Quindi l’unica cosa da fare se volete avere un mount point fisso per il vostro filesystem non é altro che impostare una label a vostro piacimento per tutti i dispositivi usb, quando li collegherete ve li troverete montati automaticamente in /media/<label>. Una guida su come impostare la label per i tutti i filesystem linux la trovate qui.
Inoltre, se avete necessità di impostare delle opzioni di mount avanzate, potete utilizzare in ogni caso il file fstab prendendo come device /dev/disk/by-label/<label> e forzare il punto di mount o le opzioni come meglio credete.











