2009-09-06 7 views
0

J'ai une colonne id qui est une clé primaire avec AUTO_INCREMENT. J'ai besoin de la valeur générée pour être insérée dans la colonne id, ainsi que d'une autre colonne (qui n'est pas définie sur AUTO_INCREMENT et qui n'est pas unique.)Comment insérer la valeur dérivée de AUTO_INCREMENT dans une autre colonne dans la même requête INSERT?

Actuellement, j'utilise la fonction mysqld_isnert_id() pour obtenir l'ID, et simplement lancer une requête de mise à jour après l'insertion, mais je me demandais si je pouvais le faire sans lancer la 2ème requête de mise à jour

+0

J'ai essayé cela une fois et n'ai pas trouvé de solution. Bonne chance, de toute façon! –

Répondre

0

Si je me souviens bien, l'ID généré automatiquement n'est même créé qu'après que l'insertion a été Votre méthode de deux requêtes est probablement le seul moyen sans plonger dans une procédure stockée peut-être

1

après insertion Trigger?

+0

C'est toujours deux requêtes, mais simplement obscurcies. – Saem

+0

Dûment noté, mais la ligne doit être insérée pour être un identifiant généré. Donc, il semble que nous ayons besoin de deux étapes plutôt qu'une. –

+0

Faux, vous pouvez obtenir le prochain ID, c'est juste une question de savoir où il vit. – Saem

0

Vous pouvez définir un déclencheur le long des lignes de:

delimiter // 
CREATE TRIGGER upd_check AFTER INSERT ON mainTable 
FOR EACH ROW 
BEGIN 
    UPDATE dependingTable 
    SET dependingTable.column = NEW.id 
END;// 
delimiter ; 

Je ne sais pas exactement quand la valeur AUTO_INCREMENT est générée, mais vous pouvez essayer ce qui suit, car si cela fonctionne, il vous épargnera une mise à jour (Si la colonne que vous voulez la valeur répliquée à est dans la même ligne que la ligne insérée):

CREATE TRIGGER upd_check BEFORE INSERT ON mainTable 
FOR EACH ROW 
SET NEW.column = NEW.id 
0

la seule façon que je peux voir que vous le faire avec une seule requête est d'utiliser le schéma d'information. Dans le schéma d'information il y a une table appelée 'tables', là vous accédez à la colonne auto_increment. Cela contient l'ID d'insertion NEXT pour cette table, vous pouvez y accéder via une sélection imbriquée, il suffit de donner à l'utilisateur utilisé pour se connecter à l'accès en lecture de la base de données à cette table. Cela fonctionnera uniquement avec les moteurs innodb autant que je peux dire que de cette façon, la sélection imbriquée que vous ferez pour remplir le second champ d'identification fera partie de la plus grande transaction de l'insertion.

C'est ce que votre requête pourrait ressembler à:

INSERT INTO fooTable VALUES (0, (SELECT AUTO_INCREMENT FROM information_schema.TABLES)); 

Aussi, si vous êtes inquiet au sujet d'accès en lecture et les questions de sécurité, rappelez-vous que c'est la même information que vous pouvez obtenir en exécutant un état de table de salon. En parlant de cela, j'ai essayé de voir si vous pouviez projeter les commandes show/requêtes via un select et vous ne pouvez pas, ce qui est totalement nul, parce que cela aurait été une solution beaucoup plus propre.

Questions connexes