title: Merge (database)
text: # Merge (database)
  
  Merge, o MRG_MyISAM, è uno storage engine di MySQL e dei suoi fork. Una tabella di tipo Merge è una collezione di tabelle MyISAM aventi le stesse colonne e gli stessi indici. Le colonne e gli indici devono avere gli stessi nomi, lo stesso ordine e le stesse caratteristiche in tutte le tabelle MyISAM che fanno parte della stessa Merge. Esse però non devono necessariamente trovarsi nello stesso database e possono avere formati e opzioni (PACK_KEYS, MAX_ROWS...) differenti.
  
  Questo tipo di tabella è stato creato nelle più vecchie versioni di MySQL principalmente per supplire al mancato supporto alle viste e al partizionamento, ma ancora oggi può risultare utile.
  
  La licenza è la GNU GPL versione 2.
  
  ## Struttura dei file
  
  Ogni tabella di tipo Merge è registrata in due file differenti. Ognuno ha un nome costituito da due parti: il nome di base è uguale al nome della tabella, mentre l'estensione indica la funzione del file.
  
  * Il file .frm contiene la definizione della struttura della tabella, come per le MyISAM.
  * Il file .MRG contiene i nomi delle tabelle MyISAM che compongono la Merge.
  
  ## Merge di dati
  
  Due tabelle possono essere confrontate in base a uno o più campi. I record di queste colonne devono avere lo stesso formato e tipologia di dati, e fra di essi viene creato un vincolo di integrità referenziale.
  
  Il legame fra lo stesso campo di due o più tabelle può essere in generale di quattro tipi:
  
  * 1) inner join: selezione degli elementi comuni ai due campi. Equivale all'intersezione fra insiemi. Contestualmente il software può consentire l'operazione di complemento a uno fra un insieme e l'intersezione, che equivale a trovare gli elementi comuni e non comuni di due elenchi. Può essere fatto con un foglio di calcolo, senza ricorrere a codice SQL.
  * 2) outer join, di tre tipi:
     * 2a) right outer join: selezione di tutti gli elementi della tabella più a destra e solo degli elementi identici a questi nelle altre tabelle;
     * 2b) left outer join: selezione di tutti gli elementi della tabella più a sinistra e solo degli elementi identici a questi nelle altre tabelle;;
     * 2c) full outer join: selezione di tutti gli elementi di tutte le tabelle, che siano comuni o meno. Questa operazione equivale all'unione di più insiemi, di più tabelle in una unica, senza perdita di informazione.
  
  Il merge di dati può essere effettuato unendo le tabelle di origine in un'unica tabella, che avrà le colonne comuni con lo stesso formato, e delle celle nei campi che ciascuna tabella di origine non ha in comune con l'altra. Una tabella pivot permette poi di contare le occorrenze di ciascuna colonna comune, e filtrare quelli superiori a uno, che sono i valori ripetuti.
  
  ## Come creare una tabella di tipo Merge
  
  La sintassi per creare una tabella Merge è la seguente:
  
  Come si può notare, la tabella totale ha la stessa struttura delle due tabelle sottostanti. Il campo a non è dichiarato come chiave primaria perché il motore Merge non può garantire l'unicità dei dati.
  
  Le due opzioni seguenti sono molto importanti:
  
  * UNION elenca le tabelle che fanno parte della MERGE.
  * INSERT_METHOD specifica se la MERGE può accettare l'inserimento di dati, e in quale tabella. I valori possibili sono:
     * FIRST - i nuovi dati vengono inseriti nella prima MyISAM elencata in UNION
     * LAST - i nuovi dati vengono inseriti nell'ultima MyISAM elencata in UNION
     * NO - nessun nuovo record può essere inserito, la tabella MERGE è di sola lettura (sarà però possibile inserire dati direttamente nelle MyISAM sottostanti)
  
  Per modificare la lista delle tabelle sottostanti:
  
  