IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Dupliquer une entrée en changeant un champ et une clé primaire non auto incrémentée


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Lycéen
    Inscrit en
    Juillet 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2007
    Messages : 148
    Points : 145
    Points
    145
    Par défaut Dupliquer une entrée en changeant un champ et une clé primaire non auto incrémentée
    Bonjour,

    Je dois dupliquer les entrées d'une table de la forme (pk, key1, key2,...) en changeant key1 par une autre valeur, mais le problème c'est qu'il y a une primary key (un entier) qui ne s'incrémente pas toute seule (et je ne peux pas changer ça).
    Est-ce qu'il y a un moyen simple d'insérer la nouvelle colonne dupliquée ou il faut faire une procédure vérifiant la valeur maximale de la colonne pk et en attribuant moi même la nouvelle valeur?

    Merci.

  2. #2
    Membre chevronné
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    Oui il y a toujours moyen !

    Par contre, serait-il possible de poser clairement ton problème avec des exemples histoire qu'on ne grille pas nos derniers neurones à tenter une compréhension plausible de ta problématique ?


  3. #3
    Membre habitué
    Lycéen
    Inscrit en
    Juillet 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2007
    Messages : 148
    Points : 145
    Points
    145
    Par défaut
    J'ai une table contenant les champs suivants : (id, col1, col2,...)
    J'ai une ligne de cette table, par exemple (3, 'TEST', 'COUCOU',...)
    Et je veux dupliquer cette ligne en changeant 'TEST' par 'SALUT, mais le soucis c'est que id est une clé primaire, et elle n'a pas la propriété de s'autoincrémenter à chaque insertion.
    Du coup, si je fais un truc bête, il recopie aussi l'id du champ initial, et il me renvoie une erreur comme quoi le champ id doit être unique.

    Ma question est donc de savoir s'il y a un truc plus simple que de faire une procédure qui va voir quel est l'id maximal présent dans la table puis d'insérer (idmax +1, 'SALUT', 'COUCOU',...).

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Si tu dois trouver l'id maxi pour y ajouter 1, c'est que tu fais une incrémentation de l'ID non ?
    Pourquoi cet identifiant n'est pas auto-incrémenté ?

    Sinon peut-être que tu n'as pas besoin d'une procédure. As-tu essayé ce genre de requête ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO la_table (id, col1, col2)
    SELECT 
    	(SELECT MAX(id) + 1
    	FROM la_table),
    	col1,
    	col2
    FROM la_table
    WHERE id = 3
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Si tu as déjà toutes les données que tu veux insérer, ceci pourrait fonctionner :
    INSERT INTO la_table (id, col1, col2)
    VALUES (
    COALESCE((SELECT MAX(`id`) FROM la_table AS bidouillou) +1,1) ,
    'TEST',
    'COUCOU'
    );

    Par contre, en cas de requêtes simultanées, il y a peut être des risques d'avoir la même clé !

  6. #6
    Membre habitué
    Lycéen
    Inscrit en
    Juillet 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2007
    Messages : 148
    Points : 145
    Points
    145
    Par défaut
    J'avais oublié de préciser, mais il peut y avoir plusieurs champs ayant la même valeur dans col1, et bien sûr ils sont tous dupliqués.
    Là j'ai réussi à faire un truc en utilisant un curseur et une boucle for pour incrémenter la valeur de l'id pour chaque ligne, mais s'il y a plus simple je suis preneur.

    Je ne sais pas trop pourquoi l'id n'est pas autoincrémentée, mais je ne peux pas changer ça, du moins pas sans voir ça avec d'autres personnes.
    Le truc c'est qu'il y a déjà plusieurs autres morceaux de codes qui font un peu ce qu'ils veulent avec l'id je crois, et je sais pas trop comment ça va réagir si on change cette propriété là.
    Après si ça change rien, pourquoi pas.

    Après du coup pour l'instant il y a toujours le soucis des collisions, que je ne sais pas vraiment comment traiter.

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Euh...
    incrémenter la valeur de l'id pour chaque ligne
    J'espère que tu parles ici de la manip que tu cherchais en insérant une ligne dans la table et on bidouillant pour lui donner comme identifiant le MAX(id) + 1 ?

    Parce que quand je lis ça :
    Le truc c'est qu'il y a déjà plusieurs autres morceaux de codes qui font un peu ce qu'ils veulent avec l'id je crois
    J'ose espérer qu'il ne s'agit pas de modifier la valeur d'un identifiant pour une ligne ?
    On ne fait JAMAIS ça s'il s'agit de la clé primaire ! Une clé primaire est invariable ! Par contre, si elle est référencée en tant que clé étrangère, la clé étrangère peut changer de valeur si l'association de la ligne concernée change.

    Tu devrais nous expliquer un peu plus concrètement ton besoin dans son contexte réel parce que à te lire j'ai l'impression que toi et "les autres personnes" êtes partis sur un mauvais chemin !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  8. #8
    Membre habitué
    Lycéen
    Inscrit en
    Juillet 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2007
    Messages : 148
    Points : 145
    Points
    145
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Euh...

    J'espère que tu parles ici de la manip que tu cherchais en insérant une ligne dans la table et on bidouillant pour lui donner comme identifiant le MAX(id) + 1 ?

    Parce que quand je lis ça :

    J'ose espérer qu'il ne s'agit pas de modifier la valeur d'un identifiant pour une ligne ?On ne fait JAMAIS ça s'il s'agit de la clé primaire ! Une clé primaire est invariable ! Par contre, si elle est référencée en tant que clé étrangère, la clé étrangère peut changer de valeur si l'association de la ligne concernée change.
    Je me suis mal exprimé. Je cherche la valeur max de l'id, puis dans la boucle for j'insère une nouvelle ligne avec une valeur de l'id correspondant à la précédente +1.
    Mais ce que j'ai l'impression que les autres procédures font c'est de choisir la valeur de l'id à l'insertion d'une nouvelle ligne, et pas forcément prendre celle suivante.

    Citation Envoyé par CinePhil Voir le message
    Tu devrais nous expliquer un peu plus concrètement ton besoin dans son contexte réel parce que à te lire j'ai l'impression que toi et "les autres personnes" êtes partis sur un mauvais chemin !
    Ben le contexte c'est que je suis stagiaire et que la moitié des personnes est en vacances, du coup je fais comme je peux pour réaliser cette tâche.
    En fait ce que je dois faire c'est dupliquer un utilisateur, et les entrées liées qui vont avec dans les autres tables, mais dans une table en particulier qui peut donc contenir plusieurs lignes concernant le même utilisateur, il y a cet id qui m'embête un peu.

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    C'est peut-être tard mais, comme je cherchais à peu près la même chose, et qu'une réponse peut toujours servir à d'autres :

    Citation Envoyé par bogoss91 Voir le message
    J'ai une table contenant les champs suivants : (id, col1, col2,...)
    J'ai une ligne de cette table, par exemple (3, 'TEST', 'COUCOU',...)
    Et je veux dupliquer cette ligne en changeant 'TEST' par 'SALUT, mais le soucis c'est que id est une clé primaire, et elle n'a pas la propriété de s'autoincrémenter à chaque insertion.
    Du coup, si je fais un truc bête, il recopie aussi l'id du champ initial, et il me renvoie une erreur comme quoi le champ id doit être unique.

    Ma question est donc de savoir s'il y a un truc plus simple que de faire une procédure qui va voir quel est l'id maximal présent dans la table puis d'insérer (idmax +1, 'SALUT', 'COUCOU',...).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO la_table SELECT (SELECT MAX(id) + 1 FROM la_table), "SALUT", col2 FROM la_table WHERE id=3;
    Testé et approuvé.

    Et voilà (J'ai trouvé le truc tout seul comme un grand )

Discussions similaires

  1. [MySQL-5.0] Modifier un champ d'une table d'après le champ d'une autre table
    Par LJubi dans le forum MySQL
    Réponses: 5
    Dernier message: 13/11/2014, 22h49
  2. Renseigner une list box à partir du champ d'une table
    Par Daniel MOREAU dans le forum Access
    Réponses: 5
    Dernier message: 21/11/2006, 17h23
  3. Réponses: 4
    Dernier message: 07/08/2006, 16h19
  4. Réponses: 2
    Dernier message: 07/08/2006, 11h51
  5. UPDATER le champ d'une table 1 avec le champ d'une table 2
    Par alain.dissoir dans le forum Oracle
    Réponses: 2
    Dernier message: 08/06/2005, 13h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo