2012-05-17 21 views
38

Ich habe diese Aussage:INSERT INTO mit SubQuery MySQL

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, die gleichen Daten von item_costprice kopieren, aber zeigen Sie mir den Fehler:

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

Wie ich Kann das lösen?

Antwort

61

Verwenden Sie numerische Literale mit Aliasen innerhalb einer SELECT Anweisung. No () sind um die SELECT Komponente notwendig.

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 in Zusammenhang mit einer INSERT INTO...SELECT, die Aliase nicht wirklich notwendig sind, und Sie können einfach SELECT 1, 2, item_costprice, aber in einem normalen SELECT finden Sie die Aliase müssen die Spalten zugreifen zurückgegeben.

+0

wow, danke in der Tat, was ich brauchte + REP :) –

3

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

EDIT: Nun, es tat, bevor jemand die Abfrage geändert ....

+2

Dies ist eigentlich eine gute Erklärung für das Problem. – mizuti

4

Sie können einfach nur z.B.

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

'Fehler in Abfrage (1242): Unterabfrage gibt mehr als 1 Zeile zurück -> Syntax ist korrekt, aber das ist nur für eine einzelne Zeile. – stamster