Sauvegarder table avant modifications

Eléphant du PHP | 331 Messages

18 sept. 2006, 08:59

Bonjour à tous,

J'ai une procédure de calcul en php qui modifie les valeurs contenues dans 3 tables.
En début de mon code, j'aimerais rajouter une commande (sql je pense) qui dupliquerai ces 3 tables sous un autre nom de manière à pouvoir restaurer mes 3 tables si le traitement effectué ne me convient pas.

Ma question est donc la suivante : comment, avec du code, je peux faire une copie de tables ?

Merci d'avance !

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

18 sept. 2006, 13:06

Le mieux est d'effectuer la mise à jour faite par le calcul dans le cadre d'une transaction qui doit pouvoir annuler les mises à jour en cas d'erreur.

Pour celà t'as pas besoin de sauvegarder les tables concernées par la mise à jour mais seulement l'enregistrement voir les anciennes valeurs de champs concernés par les mises à jour.

Dans la pratique, on peut envisager pour toute requête de mise à jour une anti-requête de restauration. Et pour ce faire, il faut extraire et mémoriser les anciennes valeurs qui seront ciblées par la mise à jour pour pouvoir les restaurer si erreur il y a.

Par exemple:
//si la requête de mise à jour est :
//$sql_maj ="update client set adresse = '.... Paris' where id = 1";

//Les requêtes antidote sont :
//$sql_sauvegarde = "select adresse from client where id=1";
//$ancienne_adresse = $client["adresse"];
//$sql_anti_maj = "update client set adresse = '$ancienne_adresse' where id=1";

//Maintenant le programme de mise à jour et restauration:

//sauvegarde
$sql_sauvegarde = "select adresse from client where id=1";
$resultat = mysql_query($sql_sauvegarde);
$client = mysql_fetch_assoc($resultat);
$ancienne_adresse = $client["adresse"];

//Mise à jour
$sql_maj ="update client set adresse = '.... Paris' where id = 1";
$resultat = mysql_query($sql_maj);

//Restauration (doit être déclenchée selon le type d'erreur observé)
$sql_anti_maj = "update client set adresse = '$ancienne_adresse' where id=1";
$resultat = mysql_query($sql_anti_maj);
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 331 Messages

18 sept. 2006, 13:57

merci Sadeq,

Cependant, c'est plus qu'un traitement de transaction avec une requete antidote que je cherche à faire.
Je voudrais pouvoir faire une copie de mes tables, et pouvoir supprimer la précédente copie (si elle existe).
Par exemple, sous access, avant de lancer des tests, il est trés facile de se duppliquer des tables.
Sous PhpMyAdmin ou avec du code php, je ne sais pas le faire, et j'aimerais vraiment savoir comment je pourrais m'y prendre.

Merci !

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

18 sept. 2006, 15:25

Dans ce cas SQL peut le faire par un simple CREATE TABLE pour créer la table destinataire de la copie et un INSERT INTO combiné avec un SELECT au lieu de VALUES pour copier les enregistrements automatiquement.

Exemple :
si la structure de la table à copier est :

Code : Tout sélectionner

maTable (id int, nom varchar(30))
alors la structure et la procédure de la copie est comme suit:

Code : Tout sélectionner

CREATE TABLE copie_de_maTable (id int, nom varchar(30)); INSERT INTO copie_de_maTable SELECT * FROM maTable;
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 331 Messages

18 sept. 2006, 15:30

voilà, parfait, merci, c'est exactement ce que je cherchais !