ความแตกต่างหลักระหว่าง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
แล้วประสิทธิภาพของสองสิ่งนี้ล่ะ?
ความแตกต่างหลักระหว่าง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
แล้วประสิทธิภาพของสองสิ่งนี้ล่ะ?
คำตอบ:
เท่าที่ฉันสามารถบอกได้ไวยากรณ์ทั้งสองนั้นมีค่าเท่ากัน แรกคือมาตรฐาน SQL ที่สองคือนามสกุลของ MySQL
ดังนั้นพวกเขาควรจะมีประสิทธิภาพเทียบเท่าที่ชาญฉลาด
http://dev.mysql.com/doc/refman/5.6/th/insert.htmlพูดว่า:
INSERT แทรกแถวใหม่ลงในตารางที่มีอยู่ รูปแบบ INSERT ... VALUES และ INSERT ... SET ของคำสั่งจะแทรกแถวตามค่าที่ระบุไว้อย่างชัดเจน ฟอร์ม INSERT ... SELECT แทรกแถวที่เลือกจากตารางหรือตารางอื่น
INSERT INTO table SET
อย่างไร เป็นไปได้ไหม
ฉันคิดว่าส่วนขยายนั้นมีวัตถุประสงค์เพื่ออนุญาตให้มีไวยากรณ์ที่คล้ายกันสำหรับส่วนแทรกและอัพเดต ใน Oracle กลอุบายที่คล้ายกันคือ:
UPDATE table SET (col1, col2) = (SELECT val1, val2 FROM dual)
INSERT ... SET ...
INSERT ... VALUES ...
สำหรับคุณสมบัติที่คุณมีรหัสที่สั้นกว่าเร็วกว่าการเขียนเพิ่มความสามารถในการอ่านและการกำจัดความผิดพลาดที่เกิดจากการผสมลำดับคอลัมน์ของคุณเมื่อเขียนVALUES
คำสั่งของคุณ ความกล้าหาญของฉันบอกฉันว่าสุทธิดีเมื่อเทียบกับคนเลว แต่การตัดสินของคุณอาจแตกต่างกัน
เนื่องจากไวยากรณ์มีความเท่าเทียมกัน (ใน 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
ไวยากรณ์จะทำงานในขณะที่อีกคนหนึ่งจะ แต่ในกรณีที่ใช้งานได้จริงส่วนใหญ่คุณจะวนลูปผ่านชุดของเร็กคอร์ดที่จะแทรกอย่างไรก็ตามแม้ว่าอาจมีบางกรณีที่อาจสร้างคิวรีขนาดใหญ่หนึ่งคำเพื่อแทรกแถวจำนวนแถวลงในตารางในคิวรีหนึ่งเทียบกับคิวรีสำหรับ แต่ละแถวอาจมีการปรับปรุงประสิทธิภาพ ไม่รู้จริงๆ
INSERT INTO table SET
ไม่ใช่มาตรฐาน ดูเหมือนชัดเจนมากขึ้น ฉันเดาว่าฉันจะต้องใช้INSERT INTO table ([column name, column name b]) VALUES (['value a', 'value b'])
ไวยากรณ์ต่อไปแม้ว่าจะช่วยตัวเองให้พ้นจากปัญหาหากฉันพอร์ตไปยัง Postgres