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

SQL Procédural MySQL Discussion :

LAST_INSERT_ID( ) : Result consisted of more than one row


Sujet :

SQL Procédural MySQL

  1. #1
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 183
    Points : 121
    Points
    121
    Par défaut LAST_INSERT_ID( ) : Result consisted of more than one row
    Bonsoir a tous,

    Y a un truc que ne fait pas bien, mais je ne comprend pas quoi.

    Contexte très classique, 3 table:
    • une table commande
    • une table item (article)
    • entre les 2 table précedente une table item_list (liste d'articles) qui pointe sur les deux tables précédentes.


    Le script suivant crée les tables automatiquement, et initialise la table article sans aucune erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    38
     
    drop table if exists test_item;
    drop table if exists test_commande;
    drop table if exists test_item_list;
     
    create table test_item
    (
       id_test_item              int not null,
       lib_item             varchar(255) not null,
       primary key (id_test_item)
    )ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
     
    create table test_commande
    (
       id_test_commande          int not null auto_increment,
       description_commande varchar(256),
       primary key (id_test_commande)
    )ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
     
    create table test_item_list
    (
       id_test_item         int not null,
       id_test_commande          int not null,
       quantity             int not null,
       primary key (id_test_item, id_test_commande)
    )ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
     
    /* ALTER TABLE test_item_list DROP FOREIGN KEY fk_item_list; */
     
    alter table test_item_list add constraint fk_item_list foreign key (id_test_item)
          references test_item (id_test_item) on delete restrict on update restrict;
     
    /* ALTER TABLE test_item_list DROP FOREIGN KEY fk_item_list2; */
     
    alter table test_item_list add constraint fk_item_list2 foreign key (id_test_commande)
          references test_commande (id_test_commande) on delete restrict on update restrict;
     
    INSERT INTO `test`.`test_item` (`id_test_item`, `lib_item`) VALUES ('0', 'article 0'), ('1', 'article 1');
    Maintenant :
    J'ajoute un commande, je récupère l'id (auto-increment) que j'utilise pour ajouter 2 articles (dans test_list_item) via cette requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    START TRANSACTION;
    INSERT INTO `test_commande` (`description_commande`) VALUES ('ma commande');
    SELECT LAST_INSERT_ID() INTO @last_id from `test_commande`;
    INSERT INTO `test_item_list` ( `id_test_item` ,  `quantity` ,  `id_test_commande` ) VALUES ('0' , '0' , @last_id ),('1' , '0' , @last_id );
    COMMIT;
    SELECT @last_id;
    La premiere fois cette requete fonctionne, j'ai bien ma commande et les 2 articles.
    Si je relance la requete (sans effacer les éléments précédents), j'ai ce message :

    SELECT LAST_INSERT_ID( ) INTO @last_id FROM `test_commande` ;

    MySQL a répondu:
    #1172 - Result consisted of more than one row
    je suis triste.. ze comprend pas..

    Quelqu'un peut m'aider ?

  2. #2
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    bon j'ai du nouveau :

    Si je modifie ma requete ainsi (je retire l'insertion d'article)..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    START TRANSACTION;
    INSERT INTO `test_commande` (`description_commande`) VALUES ('ma commande');
    SELECT LAST_INSERT_ID() INTO @last_id from `test_commande`;
    SELECT @last_id;
    COMMIT;
    ..j'ai le même message, mais si je retire le "from test_commande'" ça marche (tout le temps) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    START TRANSACTION;
    INSERT INTO `test_commande` (`description_commande`) VALUES ('ma commande');
    SELECT LAST_INSERT_ID() INTO @last_id;
    SELECT @last_id;
    COMMIT;
    Et je fait la modif sur ma requete initiale ( en retirant le "from test_commande'") ça marche aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    START TRANSACTION;
    INSERT INTO `test_commande` (`description_commande`) VALUES ('ma commande');
    SELECT LAST_INSERT_ID() INTO @last_id;
    INSERT INTO `test_item_list` ( `id_test_item` ,  `quantity` ,  `id_test_commande` ) VALUES ('0' , '0' , @last_id ),('1' , '0' , @last_id );
    COMMIT;
    SELECT @last_id;
    Je suis a moitié satisfait, parce que je ne comprend pas :
    1. Pourquoi quand je précise la table ça ne marche plus (enfin plutot ca ne marche qu'une seule fois) ?
    2. Si je ne précise pas la table, est-ce que j'ai la certitude que l'id retourné n'est pas celui d'une autre table auto-incrémenté ?


    Je n'ai rien trouvé de très clair sur ces questions ici http://dev.mysql.com/doc/refman/5.0/...insert-id.html, j'aimerais avoir l'avis de nos honorables modérateurs et rédacteurs.

    Merci

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Points : 164
    Points
    164
    Par défaut
    LAST_INSERT_ID() est une constante indépendante de la table

    LAST_INSERT_ID()
    Retourne le dernier identifiant automatiquement généré par une colonne AUTO_INCREMENT.
    Si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select 0 from table1
    ceci t'affichera autant de lignes avec une colonne à 0 qu'il ya de lignes dans table1
    donc pareillement pour LAST_INSERT_ID()

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/09/2013, 09h14
  2. Réponses: 2
    Dernier message: 03/08/2009, 15h36
  3. Réponses: 4
    Dernier message: 25/01/2007, 15h02
  4. Réponses: 3
    Dernier message: 08/12/2006, 17h28
  5. ORA-01427: single-row subquery returns more than one row
    Par hadid dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/10/2006, 15h35

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