web-dev-qa-db-fra.com

INSERT INTO avec SubQuery MySQL

J'ai cette déclaration:

INSERT INTO qa_costpriceslog (item_code, invoice_code, item_costprice)
    VALUES (1, 2, (SELECT item_costprice FROM qa_items WHERE item_code = 1));

J'essaie d'insérer une valeur en copiant les mêmes données que item_costprice, mais montrez-moi l'erreur:

Error Code: 1136. Column count doesn't match value count at row 1

Comment je peux résoudre ça?

44
John Nuñez

Utilisez des littéraux numériques avec des alias dans une instruction SELECT. Aucun () n'est nécessaire autour du composant SELECT.

INSERT INTO qa_costpriceslog (item_code, invoice_code, item_costprice)
  SELECT
    /* Literal number values with column aliases */
    1 AS item_code,
    2 AS invoice_code,
    item_costprice
  FROM qa_items 
  WHERE item_code = 1;

Notez que dans le contexte d'un INSERT INTO...SELECT, les alias ne sont pas réellement nécessaires et que vous pouvez simplement SELECT 1, 2, item_costprice, mais que dans une SELECT normale, vous aurez besoin des alias pour accéder aux colonnes renvoyées.

74

Vous pouvez simplement, par exemple, par exemple.

INSERT INTO modulesToSections (fk_moduleId, fk_sectionId, `order`) VALUES
    ((SELECT id FROM modules WHERE title="Top bar"),0,-100);
6
Elendurwen

Votre instruction insert contient trop de colonnes à gauche ou pas assez de colonnes à droite. La partie précédant VALUES contient 7 colonnes, mais la deuxième partie après VALUES ne renvoie que 3 colonnes: 1, 2, la sous-requête ne renvoie alors qu'une colonne.

EDIT: Eh bien, c'était avant que quelqu'un modifie la requête ....

3
Andrew Landsverk

J'ai été déçu par les réponses "tout ou rien". Il me fallait (à nouveau) INSERT quelques données et SELECT une id à partir d'une table existante.

INSERT INTO table1 (id_table2, name) VALUES ((SELECT id FROM table2 LIMIT 1), 'Example');

La sous-sélection d'une requête INSERT doit utiliser des parenthèses en plus de la virgule en tant que déliminateurs.

Pour ceux qui éprouvent des difficultés à utiliser une SELECT dans une INSERT, je vous recommande de tester votre SELECT de manière indépendante en premier et de vous assurer que le nombre correct de colonnes correspond aux deux requêtes.

0
John