Forum Clubic

Désactiver les primary keys avec mysql

:hello:

Mon titre est pas très clair, mais j’ai pas trouvé mieux ^^.

Mon problème :

J’ai un serveur utilisé pour faire des traitements de données, et un serveur de production qui utilise réellement ces données, il ne fait que les afficher.

Selon les traitements, la valeur d’auto-increment peut être très différente (plus élevée) que sur le serveur de production.

Ce que j’aimerais, c’est que le serveur de production utilise sa propre valeur d’incrément pour la clé primaire, et pas la valeur passée par le dump du serveur de traitement.

La question : comment faire pour ne pas dumper la colonne “id” du serveur de traitement ?

J’espère que j’ai été assez clair, sinon posez moi des questions

Je peux bien sûr faire comme ça


sed -e 's/([0-9]*,/(/g' -e 's/(`id`, /(/' $temp_file > $final_file

Pour supprimer la colonne une fois le dump effectué.

Mais s’il y a quelque chose de prévu dans mysqldump, ça serait quand même plus propre.

Je pense pas que tu puisses omettre une colonne avec mysqldump.

Tu peux pas le faire en deux temps ?
Sur le serveur de calcul :
SELECT tous_tes_champs_sans_l’identifiant FROM ta_table INTO OUTFILE ‘backup.txt’;
puis sur le serveur de prod :
LOAD DATA INFILE INTO TABLE ta_table (tous_tes_champs_sans_l’identifiant)

Tu peux dire à mysqldump de faire des insert complet, soit avec tous les noms de champs, et supprimer ton champ via sed.

sinon ma petite préférée : tu génère ta requête SQL en SQL :smiley:

Tient, ces problèmes de clef primaires sont récurrrents.
bref, vu que ton serveur prod ne fait qu’afficher, il ne vaudrait pas mieux conserver cet id au contraire, et faire en sorte qu’il n’utilise pas de valeur d’incrément?

Les trous, c’est le mal. :kaola:

ignorant :o
Edité le 14/08/2007 à 16:28

Le fichier SQL final contient aussi d’autres données, donc non :confused:

Comment ?

Ben j’ai peur d’avoir une fois des ID dupliqués :confused:

Je pensais que le serveur de traitement était la “référence”, et que donc on pouvait faire un annulle et remplace de toutes les données de traitement sur la prod, mais ce n’est pas possible?

Est-ce qu’il n’y a pas des fonctionnalités de Synchro ou réplication dans ces cas là?

Le truc c’est que s’il y a eu des erreurs de traitement on va regénérer les données. Effectivement les valeurs des ID seraient plus grandes, mais je trouve pas ça très sûr. :confused:

NeqO>

SELECT CONCAT(‘UPDATE XXX SET …’) AS “query”
FROM XXX

:wink:

Par contre, le CONCAT n’est pas dispo partout, donc faut utiliser || (opérateur de concaténation “standard”) mais pas sous SQLServer, où c’est “+” quand il le veut bien…

C’est quoi le but dans l’application finale ?
Parce qu’effectivement, il pourrait y avoir une solution plus adaptée.

Je veux faire des insert pas des UPDATE :expressionless:
Mais en fait j’imagine que c’est la même chose

Le site web (sur le serveur de production) doit afficher des graphiques générés à partir de données

ces données sont récupérées de plusieurs endroit différents par le serveur de traitement. Celui-ci normalise les données avant de les envoyer au serveur qui va les afficher.

Mais cmme je vois ça, j’ai l’impression que le plus simple est d’utiliser sed, vu qu’il n’y a pas d’option mysql qui fasse ce que je veux.

Il y a une autre solution, c’est de construire tes deux tables comme ça :

Comme ça tu gardes ton association et peux utiliser mysqldump directement, l’auto incrément sera totalement indépendant. :slight_smile:
Edité le 14/08/2007 à 19:12

Très bonne idée, je pense que je vais faire comme ça, merci !