MySQL INSERT INTO table VALUES .. vs INSERT INTO table SET

252

Apa perbedaan utama antara INSERT INTO table VALUES ..dan INSERT INTO table SET?

Contoh:

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

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

Dan bagaimana dengan kinerja keduanya?

Irmantas
sumber
12
Setelah membaca Kode Lengkap dan penekanan konstan McConnell pada keterbacaan, tampaknya disayangkan INSERT INTO table SETtidak standar. Tampaknya jauh lebih jelas. Saya kira saya tetap harus menggunakan INSERT INTO table ([column name, column name b]) VALUES (['value a', 'value b'])sintaks untuk menyelamatkan diri dari masalah jika saya porting ke Postgres.
cluelesscoder

Jawaban:

195

Sejauh yang saya tahu, kedua sintaksinya sama. Yang pertama adalah standar SQL, yang kedua adalah ekstensi MySQL.

Jadi mereka harus setara dengan kinerja bijaksana.

http://dev.mysql.com/doc/refman/5.6/en/insert.html mengatakan:

INSERT menyisipkan baris baru ke dalam tabel yang ada. INSERT ... VALUES and INSERT ... SET bentuk form baris pernyataan pernyataan berdasarkan nilai yang ditentukan secara eksplisit. INSERT ... SELECT form menyisipkan baris yang dipilih dari tabel atau tabel lain.

Vinko Vrsalovic
sumber
4
Bagaimana cara Anda menyisipkan beberapa nilai menggunakan INSERT INTO table SET? Apakah ini mungkin?
pixelfreak
2
Maksud kamu apa? Contoh OP mengatakan SET a = 1, b = 2, c = 3 yang merupakan beberapa nilai dalam pemahaman saya.
Vinko Vrsalovic
10
Maksud saya, INSERT beberapa baris. Seperti: INSERT INTO table (a, b, c) VALUES (1,2,3), (4,5,6), (7,8,9);
pixelfreak
5
Hanya pernyataan INSERT yang menggunakan sintaks VALUES yang bisa menyisipkan banyak baris.
Vinko Vrsalovic
8
@VinkoVrsalovic, tidak benar, pilih insert juga dapat menyisipkan beberapa baris ketika beberapa baris dipilih
Pacerier
15

Saya pikir ekstensi ini dimaksudkan untuk memungkinkan sintaksis yang sama untuk memasukkan dan memperbarui. Di Oracle, trik sintaksis yang serupa adalah:

UPDATE table SET (col1, col2) = (SELECT val1, val2 FROM dual)
fthiella
sumber
5
@Pacerier Seperti? Satu-satunya masalah yang saya lihat adalah masalah portabilitas (yang, dalam banyak konteks tidak terlalu penting); apakah saya melewatkan sesuatu?
Mark Amery
1
@MarkAmery, ya ketika Anda melihatnya, tidak ada manfaat nyata. Kerugiannya adalah waktu yang tidak perlu terbuang , seluruh keberadaan utas ini membuktikan maksud saya.
Pacerier
8
@Pacerier Saya tidak yakin saya mengerti maksud Anda? Waktu apa yang terbuang? Ada manfaatnya, yang telah ditunjukkan: Anda hanya perlu mengulangi susunan pasangan kunci / nilai satu kali untuk membuat pernyataan INSERT, alih-alih dua kali jika Anda perlu menggunakan sintaks VALUES, yang mengarah pada yang lebih pendek, lebih jelas. , dan kode lebih cepat untuk menulis.
Mark Amery
@MarkAmery tetapi trik oracle ini tidak memiliki manfaat itu. Anda beri nama semua kolom terlebih dahulu, lalu semua nilai.
hobbs
12
@ Peracer Itu poin yang adil, dan ada tradeoff yang harus ditimbang. Terhadap fitur Anda memiliki masalah portabilitas dan waktu terbuang meneliti perbedaan antara INSERT ... SET ...dan INSERT ... VALUES .... Untuk fitur Anda memiliki kode yang lebih pendek, lebih cepat untuk menulis, peningkatan keterbacaan, dan penghapusan kesalahan ketik yang disebabkan oleh pencampuran urutan kolom Anda saat menulis VALUESklausa Anda . Perasaan saya memberi tahu saya bahwa di internet kebaikan melebihi kejahatan, tetapi penilaian Anda mungkin berbeda.
Mark Amery
4

Karena sintaksinya sama (dalam MySQL bagaimanapun), saya lebih suka INSERT INTO table SET x=1, y=2 sintaksisnya, karena lebih mudah untuk memodifikasi dan lebih mudah untuk menangkap kesalahan dalam pernyataan, terutama ketika memasukkan banyak kolom. Jika Anda harus memasukkan 10 atau 15 kolom atau lebih, sangat mudah untuk mencampur sesuatu menggunakan (x, y) VALUES (1,2)sintaks, menurut saya.

Jika portabilitas antara standar SQL yang berbeda adalah masalah, maka mungkin INSERT INTO table (x, y) VALUES (1,2) akan lebih disukai.

Dan jika Anda ingin menyisipkan banyak rekaman dalam satu permintaan, sepertinya tidak ada INSERT INTO ... SET sintaks tidak akan berfungsi, sedangkan yang lain akan. Namun dalam kebanyakan kasus praktis, Anda mengulangi serangkaian catatan untuk melakukan sisipan, meskipun mungkin ada beberapa kasus di mana mungkin membangun satu kueri besar untuk menyisipkan sekelompok baris ke tabel dalam satu kueri, vs. kueri untuk setiap baris, mungkin memiliki peningkatan kinerja. Benar-benar tidak tahu.

Aaron Wallentine
sumber