it-swarm.com.de

INSERT INTO mit SubQuery MySQL

Ich habe diese Erklärung:

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

Ich versuche einen Wert einzufügen, kopiere die gleichen Daten von item_costprice, zeige aber den Fehler:

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

Wie kann ich das lösen?

44
John Nuñez

Verwenden Sie numerische Literale mit Aliasnamen in einer SELECT-Anweisung. Um die Komponente SELECT sind keine ()-Werte erforderlich.

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;

Beachten Sie, dass die Aliase im Kontext eines INSERT INTO...SELECT nicht unbedingt erforderlich sind und Sie können einfach SELECT 1, 2, item_costprice, aber in einer normalen SELECT benötigen Sie die Aliase, um auf die zurückgegebenen Spalten zuzugreifen.

74

Sie können einfach nur z.

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

Ihre Einfügeanweisung enthält zu viele Spalten auf der linken Seite oder nicht genügend Spalten auf der rechten Seite. Der Teil vor den VALUES enthält 7 Spalten, aber der zweite Teil nach VALUES hat nur 3 zurückgegebene Spalten: 1, 2, dann gibt die Unterabfrage nur 1 Spalte zurück.

BEARBEITEN: Nun, vor einer Änderung der Abfrage ...

3

Ich war enttäuscht über die Antworten "alles oder nichts". Ich brauchte (wieder) einige Daten und INSERT und SELECT eine id aus einer vorhandenen Tabelle.

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

Die Unterauswahl für eine INSERT-Abfrage sollte zusätzlich zum Komma als Trennzeichen Klammern verwenden.

Für Benutzer, die Probleme mit der Verwendung eines SELECT innerhalb eines INSERT haben, empfehle ich zuerst, Ihren SELECT unabhängig voneinander zu testen und sicherzustellen, dass die korrekte Anzahl der Spalten für beide Abfragen übereinstimmt.

0
John