2012-05-17 55 views
38

Tôi có bản Tuyên Bố này:INSERT INTO với 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)); 

Tôi đang cố gắng để chèn một giá trị sao chép dữ liệu cùng một item_costprice, nhưng chỉ cho tôi lỗi:

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

Làm thế nào tôi có thể giải quyết điều này?

Trả lời

61

Sử dụng các chữ số bằng các bí danh bên trong câu lệnh SELECT. Không cần () xung quanh thành phần 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; 

Lưu ý rằng trong bối cảnh của một INSERT INTO...SELECT, các bí danh là không thực sự cần thiết và bạn có thể chỉ SELECT 1, 2, item_costprice, nhưng trong một bình thường SELECT bạn sẽ cần các bí danh để truy cập các cột trở lại.

+0

wow, cảm ơn thực sự là những gì tôi cần + REP :) –

3

Câu lệnh chèn của bạn chứa quá nhiều cột ở phía bên tay trái hoặc không đủ cột ở phía bên tay phải. Phần trước khi VALUES có 7 cột được liệt kê, nhưng phần thứ hai sau khi VALUES chỉ có 3 cột được trả về: 1, 2, thì truy vấn phụ chỉ trả về 1 cột.

EDIT: Vâng, nó đã làm trước khi ai đó sửa đổi các truy vấn ....

+2

Đây thực sự là giải thích tốt về vấn đề này. – mizuti

4

Bạn có thể chỉ đơn giản là ví dụ

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

'Lỗi trong truy vấn (1242): Truy vấn con trả về hơn 1 hàng' -> cú pháp là chính xác, nhưng đó chỉ là một hàng duy nhất. – stamster

Các vấn đề liên quan