Duplicare una tabella e dati

Gli argomenti di questa pagina

  • Prima di iniziare
  • Duplicare una tabella solo struttura: CREATE TABLE ... LIKE
  • Duplicare una tabella con dati: INSERT INTO e subquery
  • Esempi di Query per copiare i dati da una tabella ad un'altra

Prima di iniziare

Una volta che abbiamo delle tabelle è possibile iniziare.
In questa pagina vedremo:

  • Duplicare una tabella solo struttura: CREATE TABLE ... LIKE
  • Duplicare una tabella con dati: INSERT INTO e subquery
  • Esempi di Query per copiare i dati da una tabella ad un'altra

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.

Il file db_login.php
1
2
3
4
5
6
<?php
$Host 
"hostname";
$User "username";
$Password "password";
$DBName "DBName";
?>

Questo che segue è un frammento di codice che sarà necesario per eseguire la connessione al DB ed alla esecuzione delle Query.

Questo frammento di codice va inserito nella pagina che deve eseguire operazioni col DB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
include ('res/db_login.php');
if (!
$link mysql_connect($Host$User$Password)) {
    echo 
mysql_error() . "<br />\n";
} else {
    if (!
mysql_select_db($DBName)) {
        echo 
mysql_error() . "<br />\n";
    } else {
        
mysql_set_charset("utf8"); 
        
//    esecuzione della Query
        
$result mysql_query($Query);
        if (!
$result) {
            echo 
mysql_error() . "<br />\n";
        } else {
            echo 
"Query eseguita<br />\n";
            
//    qui vengono eseguiti altri eventuali lavori
        
}
    }
}
@
mysql_close ($Link);
?>

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.

Chiusura della connessione al DB
1
2
3
<?php
mysql_close 
($link);
?> 

A scopo puramente semplificativo, negli script degli esempi di questa pagina viene usata sia la connessione al DB estesa che quella tramite questa semplice funzione che viene richiamata con: $Link = db_connect()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
function db_connect() {
    global 
$Host;
    global 
$User;
    global 
$Password;
    global 
$DBName;
    if (!
$link mysql_connect($Host$User$Password)) {
        echo 
mysql_error() . "<br />\n";
        return 
FALSE;
    }
    if (!
mysql_select_db($DBName)) {
        echo 
mysql_error() . "<br />\n";
        return 
FALSE;
    }
    
mysql_set_charset("utf8");
    return 
$link;
}
?>

Duplicare una tabella solo struttura: CREATE TABLE ... LIKE

Alle volte può tornare utile poter avere la possibilità di duplicare una tabella. Un caso tipico in cui questa possibilità è particolarmente utile è quando abbiamo una tabella con dati e vogliamo agire su questa tabella in maniera drastica e, magari, distruttiva.
L'operazione non è molto complessa ed altrettanto semplice è la query da utilizzare, come visibile nel frammento di codice qui sotto.
La Query chiede di creare la tabella desiderata usando (LIKE) la tabella esistente.
Col codice mostrato qui sotto si genera una tabella con la struttura uguale all'originale ma vuota. Se volessimo trasferire nella nuova tabella anche i dati contenuti nella tabella originale il precedente codice potrebbe essere modificato come quello che segue immediatamente sotto.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
include ('res/db_login.php');
$original_table "sql_rubrica";
$new_table "sql_rubrica_nuova";
$Query "CREATE TABLE " $new_table " LIKE " $original_table ";";
if (!
$link mysql_connect($Host$User$Password)) {
    echo 
mysql_error() . "<br />\n";
} else {
    if (!
mysql_select_db($DBName)) {
        echo 
mysql_error() . "<br />\n";
    } else {
        
mysql_set_charset("utf8"); 
        
$result mysql_query($Query);
    }
}
@
mysql_close ($Link);
//    In alternativa è possibile usare la funzione personale copiata nel file res.php
/*
include ('res/db_login.php');
include ('res/res.php');
$original_table = "sql_rubrica";
$new_table = "sql_rubrica_nuova";
if (@$Link = db_connect()) {
    $Query = "CREATE TABLE " . $new_table . " LIKE " . $original_table . ";";
    echo $Query . "<br />\n";
    $result = mysql_query($Query);
    if (!$result) {
        echo mysql_error();            
    } else {
        echo "Tabella creata correttamente<br />\n";
    }
} else {
    echo "Si sono verificati problemi col DB<br />\n";
}
@mysql_close ($Link);
*/
?>

Duplicare una tabella con dati: INSERT INTO e subquery

Oltre alla struttura è possibile copiare anche i dati prelevandoli dalla tabella originale. Ma l'azione deve avvenire in due tempi ed usando due Query:
La prima query è come la precedente e serve per creare la tabella e la sua struttura.
La seconda query per l'inserimento è intuitiva: nella istruzione INSERT INTO nella nuova tabella segue, al posto dei soliti valori, una SubQuery SELECT sulla vecchia tabella per selezionare i record desiderati: INSERT INTO sql_rubrica_nuova (SELECT * from sql_rubrica).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
include ('res/db_login.php');
if (!
$link mysql_connect($Host$User$Password)) {
    echo 
mysql_error();
} else {
    if (!
mysql_select_db($DBName)) {
        echo 
mysql_error();
    } else {
        
mysql_set_charset("utf8");
        
$Query "CREATE TABLE sql_rubrica_nuova LIKE sql_rubrica;";
        
$result mysql_query($Query);
        if (!
$result) {
            echo 
mysql_error() . "<br />\n";            
        } else {
            echo 
"Tabella creata correttamente<br />\n";
        }
        
$Query_ins "INSERT INTO sql_rubrica_nuova (SELECT * from sql_rubrica)";
        
$result_ins mysql_query($Query_ins);
        if (!
$result_ins) {
            echo 
mysql_error() . "<br />\n";
        } else {
            echo 
"Dati inseriti correttamente<br />\n";
        }
    }
}
mysql_close ($link);
?>

Esempi di Query per copiare i dati da una tabella ad un'altra

Qui sopra è stato anticipato uno dei metodi da usare per copiare tutti i dati da una tabella ad un'altra. Ma ne possiamo usare tanti altri. Gli unici limiti sono le nostre necessità e la nostra fantasia.
Ma può capitare che in una tabella si vogliano copiare solo parte dei dati prelevandoli da un'altra tabella.
Qui sotto abbiamo quattro Query di esempio:

  • la prima Query copia tutti i campi di tutti i record da una tabella ad un'altra
  • la seconda Query copia solo alcuni campi di tutti i record ordinandoli per citta
  • la terza Query copia alcuni campi dei soli record di una determinata prov
  • la quarta Query copia alcuni campi dei record che hanno la provincia BO oppure CH usando l'operatore di appartenenza IN. In questo caso viene usato l'operatore IN per verificare l'appartenenza di un valore ad una lista di valori invece di una serie di espressioni OR.

L'operatore di appartenenza IN permette di specificare un elenco di criteri da indicare nel filtro di una clausola WHERE. L'elenco va racchiuso in parentesi tonda e separato da virgola.
Un esempio è visibile nel quarto esempio qui in basso per indicare che vogliamo estrarre tutti i record con provincia 'BO' o 'CH'.
Ovviamente potremmo scrivere una dichiarazione che utilizza una serie di espressioni OR. ma in questi casi è molto più semplice e rapido è quello di fornire l'elenco dei criteri desiderati utilizzando la clausola IN.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$Query 
"INSERT INTO sql_rubrica_nuova (SELECT * from sql_rubrica)";

$Query "INSERT INTO sql_rubrica_nuova (cap, citta, prov) 
SELECT DISTINCT cap, citta, prov FROM sql_rubrica order by citta"
;

$Query " INSERT INTO sql_rubrica_nuova( cap , citta , prov )
(SELECT DISTINCT cap , citta , prov
FROM sql_rubrica
WHERE prov = 'BO'
ORDER BY citta) "
;

$Query "INSERT INTO sql_rubrica_nuova 
( cap , citta , prov ) 
(SELECT DISTINCT cap , citta , prov 
FROM sql_rubrica 
WHERE prov IN ('BO', 'CH') 
ORDER BY citta) ;"
;
?>

 

 



settore tecnico il sito di lorettabweb il Forum di sostegno
il forum il forum il forum