Page 1 sur 1

Archivage journalier avec auto_increment

Posté : 11 déc. 2010, 13:49
par mctarek
Bonjour. Mon problème est simple. J'ai crée 2 tables, la table du jour tbl_exp et la table d'archivage tbl_exp_bak.
tbl_exp_bak est une duplication de tbl_exp. Donc, chaque table a une colonne id en auto_increment.
Chaque lendemain, Mon script php doit archiver la table tbl_exp vers tbl_exp_bak, puis vider la table tbl_exp (fonction truncate).
Puis, remplir de nouvelles données la table tbl_exp avec l'auto_increment qui repart toujours à 1, et ça m'arrange.
Tout se passe bien, sauf que lors de l'archivage, il y a un message "Duplicate entry '1' for key 'PRIMARY'".
Mon ami google m'a envoyé vers tous les pays anglophones mais sans réponse notable (ex: j'ai dépassé la limite de l'id...en milliard !)
Ma première solution a consisté a enlever la clef primaire sur l'id tbl_exp_bak. Et ça fonctionne pour l'archivage, mais plus d’incrémentation, bien sûr.
Tous les id se mélangent au fur et à mesure des archivages; et cela me gêne pour parcourir la table par l'indice id.
> Je cherche une solution qui me permet d'archiver vers la table tbl_exp_bak tout en maintenant l'incrémentation.
Du coup, j'ai pensé à archiver les données sauf la colonne id de la table tbl_exp. Bonne idée. Mais c'est toute ma fonction d'archivage qui tombe à l'eau
pour mes autres scripts, car elle devient du coup, spécifique à un type d'archivage. Pire, il faut me taper plusieurs noms de colonne...
J'ai cherché un équivalent mysql à SELECT * FROM matable (sauf la colonne id) mais je ne trouve pas :-)
Pouvez vous me guider ?
Merci.

Re: Archivage journalier avec auto_increment

Posté : 11 déc. 2010, 16:18
par epommate2
Dans tbl_exp_bak, tu enlève l'index sur la colonne id.

Tu ajoute une colonne id_2 primary key à tbl_exp_bak à la fin de la table

Tu exécutes :

Code : Tout sélectionner

SET @rank := (select max(id_2) FROM tbl_exp_bak); INSERT INTO tbl_exp_bak (SELECT *,@rank := @rank +1 AS rank FROM tbl_exp);

Re: Archivage journalier avec auto_increment

Posté : 11 déc. 2010, 18:54
par mctarek
Bonjour. Merci Eric pour ton intervention. J'ai suivi la consigne en supprimant l'index sur la clef id, puis en ajoutant un id_2 en primary key.
Je souligne que je n'ai pas ajouté d'auto_increment sur id_2 car non mentionné.
J'ai obtenu le message suivant : #1062 - Duplicate entry '2147483647' for key 'PRIMARY'
Et 1 ligne a été ajoutée dans tbl_exp_bak avec dans le champ id_2 un nombre sorti de nul part, et le premier champ a sauté, puis les autres ont décalé d'un cran vers la gauche.

De mon côté, je n'ai pas lâché l'affaire, et je suis tombé sur un script php étonnant (2 fonctions imbriquées) et logique :
Selecting all except some columns in MySQL
http://www.codediesel.com/mysql/selecti ... -in-mysql/
Tout en maintenant la même table tbl_exp_bak en auto_increment, il me permet d'ajouter tbl_exp sans la colonne
id (ma première intuition), et obtenir un cumul de données toujours auto incrémentées.
La requête SQL ressemble à :
CREATE TABLE IF NOT EXISTS $table2 SELECT {$stmt_list} FROM $table1
Et La fonction finale ressemble à :
exclure_champs('tbl_exp','tbl_exp_bak',array("id"))
Je suis curieux de faire fonctionner votre requête !
mctarek

Re: Archivage journalier avec auto_increment

Posté : 12 déc. 2010, 00:00
par devlop78
euhhh ... en lisant ton message d'origine, ce que j'aurais fait c'est prendre tous les champs sauf l'identifiant, et laisser l'identifiant de la sauvegarde pour qu'il s'occupe lui-même de l'auto-incrémenter. Sinon, ne pas remettre à 0 l'auto-incrément aurait été mieux, non ?

Re: Archivage journalier avec auto_increment

Posté : 12 déc. 2010, 00:33
par mctarek
C'est ce que je recherchais sans avoir à me retaper tous les noms des champs sauf l'id, et cela pour toutes les archivages des tables (du jour)...
Le script que j'ai trouvé sélectionne tous les champs d'une table sauf ceux mentionnés. C'est très pratique, car mysql n'a pas d'équivalent nativement.
euhhh ... en lisant ton message d'origine, ce que j'aurais fait c'est prendre tous les champs sauf l'identifiant, et laisser l'identifiant de la sauvegarde pour qu'il s'occupe lui-même de l'auto-incrémenter. Sinon, ne pas remettre à 0 l'auto-incrément aurait été mieux, non ?

Re: Archivage journalier avec auto_increment

Posté : 12 déc. 2010, 08:01
par epommate2
Ok, juste pour compléter ma méthode que je trouve plus propre :D

Quand tu crée l'index 2, c'est sans doute mieux de le mettre en autoincrement, puis d'enlever la propriété d'autoincrement !

Code : Tout sélectionner

#1062 - Duplicate entry '2147483647' for key 'PRIMARY'
tu as plus de 2147483647 lignes ?

Re: Archivage journalier avec auto_increment

Posté : 13 déc. 2010, 03:22
par devlop78
Une belle base de données de plusieurs Go à ce que je vois :D

Re: Archivage journalier avec auto_increment

Posté : 13 déc. 2010, 15:50
par mctarek
Moins de 200 !
Ok, juste pour compléter ma méthode que je trouve plus propre :D

Quand tu crée l'index 2, c'est sans doute mieux de le mettre en autoincrement, puis d'enlever la propriété d'autoincrement !

Code : Tout sélectionner

#1062 - Duplicate entry '2147483647' for key 'PRIMARY'
tu as plus de 2147483647 lignes ?

Re: auto_increment

Posté : 24 mars 2011, 18:07
par youness
bonjour,
J’aimerais faire un champ auto incrément mais il s'incrément par mois de 1 et un autre champ s'incrément par ans automatiquement. Ya t'il une solution soit avec PHP (je travaille avec symfony) ou java (j2EE) ou sur mysql.

merci .(voila mon mail si quelqu'un a une réponse : [email protected])