MySQL INSERT INTO VALUES .. เทียบกับ INSERT INTO SET SET


252

ความแตกต่างหลักระหว่างINSERT INTO table VALUES ..และ INSERT INTO table SETคืออะไร?

ตัวอย่าง:

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

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

แล้วประสิทธิภาพของสองสิ่งนี้ล่ะ?


12
หลังจากอ่าน Code Complete และ McConnell ให้ความสำคัญกับความสามารถในการอ่านอย่างต่อเนื่องดูเหมือนว่าน่าเสียดายที่INSERT INTO table SETไม่ใช่มาตรฐาน ดูเหมือนชัดเจนมากขึ้น ฉันเดาว่าฉันจะต้องใช้INSERT INTO table ([column name, column name b]) VALUES (['value a', 'value b'])ไวยากรณ์ต่อไปแม้ว่าจะช่วยตัวเองให้พ้นจากปัญหาหากฉันพอร์ตไปยัง Postgres
cluelesscoder

คำตอบ:


195

เท่าที่ฉันสามารถบอกได้ไวยากรณ์ทั้งสองนั้นมีค่าเท่ากัน แรกคือมาตรฐาน SQL ที่สองคือนามสกุลของ MySQL

ดังนั้นพวกเขาควรจะมีประสิทธิภาพเทียบเท่าที่ชาญฉลาด

http://dev.mysql.com/doc/refman/5.6/th/insert.htmlพูดว่า:

INSERT แทรกแถวใหม่ลงในตารางที่มีอยู่ รูปแบบ INSERT ... VALUES และ INSERT ... SET ของคำสั่งจะแทรกแถวตามค่าที่ระบุไว้อย่างชัดเจน ฟอร์ม INSERT ... SELECT แทรกแถวที่เลือกจากตารางหรือตารางอื่น


4
คุณแทรกค่าหลายค่าโดยใช้INSERT INTO table SETอย่างไร เป็นไปได้ไหม
pixelfreak

2
คุณหมายถึงอะไร ตัวอย่างที่ OP บอกว่า SET a = 1, b = 2, c = 3 ซึ่งเป็นค่าหลายค่าที่ฉันเข้าใจ
Vinko Vrsalovic

9
ฉันหมายถึง INSERT หลายแถว ไลค์: INSERT INTO ตาราง (a, b, c) ค่า (1,2,3), (4,5,6), (7,8,9);
pixelfreak

5
เฉพาะคำสั่ง INSERT ที่ใช้ไวยากรณ์ค่าสามารถแทรกหลายแถว
Vinko Vrsalovic

8
@VinkoVrsalovic ไม่เป็นความจริงตัวเลือกการแทรกสามารถแทรกหลายแถวได้เมื่อเลือกหลายแถว
Pacerier

15

ฉันคิดว่าส่วนขยายนั้นมีวัตถุประสงค์เพื่ออนุญาตให้มีไวยากรณ์ที่คล้ายกันสำหรับส่วนแทรกและอัพเดต ใน Oracle กลอุบายที่คล้ายกันคือ:

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

5
@ นายกรัฐมนตรีเช่น? ปัญหาเดียวที่ฉันเห็นคือการพกพาหนึ่ง (ซึ่งในบริบทหลายอย่างไม่สำคัญ) ฉันพลาดอะไรไปรึเปล่า?
Mark Amery

1
@ MarkAmery อ๋อเมื่อคุณดูมันไม่มีประโยชน์จริง ๆ ข้อเสียคือเสียเวลาโดยไม่จำเป็นไปเสียการมีอยู่ทั้งหมดของกระทู้นี้พิสูจน์จุดของฉัน
Pacerier

8
@Pierier ฉันไม่แน่ใจว่าฉันเห็นจุดของคุณ? เสียเวลาเท่าไร มีประโยชน์ที่ได้รับการชี้ให้เห็นแล้ว: คุณต้องวนลูปมากกว่าคู่ของคีย์ / ค่าหนึ่งครั้งเพื่อสร้างคำสั่ง INSERT ของคุณแทนที่จะเป็นสองเท่าที่คุณจะต้องใช้ไวยากรณ์ค่าซึ่งนำไปสู่การสั้นลงชัดเจนขึ้น และรหัสที่เร็วขึ้นในการเขียน
Mark Amery

@MarkAmery แต่เคล็ดลับ oracle นี้ไม่ได้มีผลประโยชน์ที่ คุณตั้งชื่อคอลัมน์ทั้งหมดก่อนแล้วตามด้วยค่าทั้งหมด
ฮอบส์

12
@Pacerier นั่นเป็นจุดที่ยุติธรรมและมีการชั่งน้ำหนักที่ต้องแลกด้วย กับสถานที่ที่คุณมีปัญหาในการพกพาและเสียเวลาในการค้นคว้าความแตกต่างระหว่างและINSERT ... SET ... INSERT ... VALUES ...สำหรับคุณสมบัติที่คุณมีรหัสที่สั้นกว่าเร็วกว่าการเขียนเพิ่มความสามารถในการอ่านและการกำจัดความผิดพลาดที่เกิดจากการผสมลำดับคอลัมน์ของคุณเมื่อเขียนVALUESคำสั่งของคุณ ความกล้าหาญของฉันบอกฉันว่าสุทธิดีเมื่อเทียบกับคนเลว แต่การตัดสินของคุณอาจแตกต่างกัน
Mark Amery

4

เนื่องจากไวยากรณ์มีความเท่าเทียมกัน (ใน MySQL แต่อย่างใด) ฉันชอบINSERT INTO table SET x=1, y=2ไวยากรณ์เพราะง่ายต่อการแก้ไขและง่ายต่อการตรวจจับข้อผิดพลาดในคำสั่งโดยเฉพาะอย่างยิ่งเมื่อแทรกคอลัมน์จำนวนมาก หากคุณต้องแทรกคอลัมน์ 10 หรือ 15 หรือมากกว่านั้นมันง่ายมากที่จะผสมผสานบางอย่างโดยใช้(x, y) VALUES (1,2)ไวยากรณ์ในความคิดของฉัน

หากปัญหาเรื่องการพกพาระหว่างมาตรฐาน SQL ที่แตกต่างกันอาจINSERT INTO table (x, y) VALUES (1,2)เป็นที่ต้องการ

และถ้าคุณต้องการที่จะแทรกหลายระเบียนในแบบสอบถามเดียวดูเหมือนว่าINSERT INTO ... SETไวยากรณ์จะทำงานในขณะที่อีกคนหนึ่งจะ แต่ในกรณีที่ใช้งานได้จริงส่วนใหญ่คุณจะวนลูปผ่านชุดของเร็กคอร์ดที่จะแทรกอย่างไรก็ตามแม้ว่าอาจมีบางกรณีที่อาจสร้างคิวรีขนาดใหญ่หนึ่งคำเพื่อแทรกแถวจำนวนแถวลงในตารางในคิวรีหนึ่งเทียบกับคิวรีสำหรับ แต่ละแถวอาจมีการปรับปรุงประสิทธิภาพ ไม่รู้จริงๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.