2009-05-14 40 views
195

Sự khác biệt chính giữa INSERT INTO table VALUES ..INSERT INTO table SET là gì?MySQL INSERT INTO bảng GIÁ TRỊ .. so với bảng INSERT INTO SET

Ví dụ:

INSERT INTO table (a, b, c) VALUES (1,2,3) 

INSERT INTO table SET a=1, b=2, c=3 

Và những gì về hiệu suất của hai này?

+9

Sau khi đọc mã Hoàn thành và nhấn mạnh liên tục McConnell về khả năng đọc, có vẻ như không may rằng 'INSERT INTO bảng SET' không phải là tiêu chuẩn. Nó có vẻ rõ ràng hơn nhiều. Tôi đoán tôi sẽ phải sử dụng 'INSERT INTO table ([tên cột, cột name b]) VALUES (['value a', 'value b'])' dù sao mặc dù để tự cứu bản thân khỏi rắc rối nếu tôi chuyển qua tới Postgres. – cluelesscoder

+0

Câu hỏi này đã lan truyền như video của Kanye! – aMazing

Trả lời

156

Theo như tôi có thể biết, cả hai cú pháp đều tương đương nhau. Đầu tiên là chuẩn SQL, thứ hai là phần mở rộng của MySQL.

Vì vậy, chúng phải chính xác về hiệu suất tương đương.

http://dev.mysql.com/doc/refman/5.6/en/insert.html nói:

INSERT chèn hàng mới vào một bảng hiện có. Các INSERT ... GIÁ TRỊ và INSERT ... SET hình thức của câu lệnh chèn hàng dựa trên các giá trị được chỉ định rõ ràng. Biểu mẫu INSERT ... SELECT chèn các hàng được chọn từ một bảng hoặc bảng khác.

+3

Làm thế nào để bạn INSERT nhiều giá trị bằng cách sử dụng 'INSERT INTO table SET'? Điều này thậm chí có thể? – pixelfreak

+2

Ý của bạn là gì? Ví dụ OP đã nói SET a = 1, b = 2, c = 3 là nhiều giá trị trong sự hiểu biết của tôi. –

+6

Ý tôi là, INSERT nhiều hàng. Giống như: bảng INSERT INTO (a, b, c) GIÁ TRỊ (1,2,3), (4,5,6), (7,8,9); – pixelfreak

13

Tôi nghĩ rằng tiện ích mở rộng nhằm mục đích cho phép một cú pháp tương tự cho chèn và cập nhật. Trong Oracle, một thủ thuật cú pháp tương tự là:

UPDATE table SET (col1, col2) = (SELECT val1, val2 FROM dual) 
+1

Tôi nghĩ rằng phần mở rộng tạo ra nhiều vấn đề hơn giải quyết. – Pacerier

+4

@Pacerier Chẳng hạn như? Vấn đề duy nhất tôi thấy là một tính di động (trong đó, trong nhiều ngữ cảnh không thực sự quan trọng); tui bỏ lỡ điều gì vậy? –

+1

@MarkAmery, yep khi bạn nhìn vào nó, không có lợi ích thực sự. Những bất lợi là ** thời gian không cần thiết lãng phí **, toàn bộ sự tồn tại của chủ đề này chứng minh quan điểm của tôi. – Pacerier

0

Kể từ khi cú pháp tương đương (trong MySQL dù sao đi nữa), tôi thích cú pháp INSERT INTO table SET x=1, y=2, vì nó là dễ dàng hơn để sửa đổi và dễ dàng hơn để bắt lỗi trong báo cáo kết quả, đặc biệt là khi chèn nhiều cột. Nếu bạn phải chèn 10 hoặc 15 cột trở lên, thật dễ dàng để kết hợp một cái gì đó bằng cách sử dụng cú pháp (x, y) VALUES (1,2), theo ý kiến ​​của tôi.

Nếu tính di động giữa các tiêu chuẩn SQL khác nhau là một vấn đề, thì có lẽ INSERT INTO table (x, y) VALUES (1,2) sẽ được ưu tiên hơn.

Và nếu bạn muốn chèn nhiều bản ghi trong một truy vấn, có vẻ như cú pháp INSERT INTO ... SET sẽ hoạt động, trong khi cú pháp kia sẽ hoạt động. Nhưng trong hầu hết các trường hợp thực tế, bạn đang lặp qua một tập hợp các bản ghi để chèn bất kỳ cách nào, mặc dù có thể có một số trường hợp có thể tạo một truy vấn lớn để chèn một loạt các hàng vào một bảng trong một truy vấn, so với truy vấn mỗi hàng, có thể có cải thiện hiệu suất. Thực sự không biết.

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