INSERT INTO เทียบกับ SELECT INTO


127

อะไรคือความแตกต่างระหว่างการใช้

SELECT ... INTO MyTable FROM...

และ

INSERT INTO MyTable (...)
SELECT ... FROM ....

?

จาก BOL [ INSERT , SELECT ... INTO ] ฉันรู้ว่าการใช้ SELECT ... INTO จะสร้างตารางแทรกในกลุ่มไฟล์เริ่มต้นหากยังไม่มีอยู่และการบันทึกสำหรับคำสั่งนี้ขึ้นอยู่กับการกู้คืน แบบจำลองของฐานข้อมูล

  1. ชอบคำสั่งไหน
  2. มีผลกระทบด้านประสิทธิภาพอื่น ๆ หรือไม่?
  3. กรณีการใช้งานที่ดีสำหรับ SELECT ... INTO over INSERT INTO ... คืออะไร?

แก้ไข: ฉันได้ระบุไว้แล้วว่าฉันรู้ว่า SELECT INTO ... สร้างตารางที่ไม่มีอยู่จริง สิ่งที่ฉันต้องการทราบก็คือ SQL มีคำสั่งนี้ด้วยเหตุผลคืออะไร? มันคือการทำสิ่งที่แตกต่างกันอยู่เบื้องหลังสำหรับแถวแทรกหรือจะเป็นเพียงน้ำตาลประโยคด้านบนของและCREATE TABLEINSERT INTO


ปัจจัยเล็ก ๆ อย่างหนึ่ง: INSERT INTOมีคำสำคัญสองคำ (select & into) อยู่ข้างหน้าเพื่อให้โลกรู้ว่านี่ไม่ใช่คำสั่ง SQL ธรรมดาในขณะที่SELECT ... INTOเริ่มต้นอย่างน้อยก็ดูเหมือนคำสั่ง SQL ธรรมดา เหตุผลเล็ก ๆ ที่ชอบอดีต
Martin F

คำตอบ:


122
  1. พวกเขาทำสิ่งที่แตกต่างกัน ใช้INSERTเมื่อมีตารางอยู่ ใช้SELECT INTOเมื่อไม่มี

  2. ใช่. INSERTโดยไม่มีคำแนะนำตารางจะถูกบันทึกตามปกติ SELECT INTOถูกบันทึกน้อยที่สุดโดยสมมติว่ามีการตั้งค่าแฟล็กการติดตามที่เหมาะสม

  3. จากประสบการณ์ของฉันSELECT INTOมักใช้กับชุดข้อมูลระดับกลางเช่น#tempตารางหรือเพื่อคัดลอกทั้งตารางเช่นการสำรองข้อมูล INSERT INTOใช้เมื่อคุณแทรกลงในตารางที่มีอยู่ซึ่งมีโครงสร้างที่รู้จัก

แก้ไข

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


4
สองเซ็นต์ของฉันฉันคิดว่าการแนะนำความล้มเหลวเป็นสิ่งที่ดี ฉันต้องการทราบว่าข้อมูลของฉันไม่ตรงกับรูปแบบ / ขนาดข้อมูลที่ฉันคาดไว้หรือไม่ ฉันมักจะพยายามที่จะกำหนดตารางของฉันโดยใช้CREATE TABLEแล้วINSERT INTOนอกจากนี้ก็ง่ายต่อการทดสอบSELECTคำสั่งด้วยตัวเองโดยไม่ต้องมีการดำเนินการแทรก
Doug Chamberlain

1
@ คุณดั๊ก - ฉันเห็นด้วย ฉันเกือบจะใช้SELECT INTOเพื่อสร้างตารางชั่วคราวหรือทำการสำรองข้อมูลอย่างรวดเร็วของตารางที่มีอยู่ซึ่งฉันจะลิงด้วย
JNK

1
@JNK - จาก BOL SELECT INTO จะสร้างตารางที่มีโครงสร้างตามชนิดข้อมูลของคอลัมน์ในรายการเลือก ดังนั้นในตัวอย่างของคุณคุณสามารถแก้ไขสถานการณ์ได้โดยการหล่อ varchar อย่างชัดเจนให้มีขนาดที่เพียงพอ แก้ไข?
jowenece

2
@Jowenece - ใช่ฉันคาดหวังอย่างนั้น ถ้าฉันจะประสบปัญหานั้นฉันจะใช้CREATEคำสั่งต่อไป
JNK

24
  1. ชอบคำสั่งไหน ขึ้นอยู่กับสิ่งที่คุณกำลังทำ

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

  3. กรณีการใช้งานที่ดีสำหรับ SELECT ... INTO over INSERT INTO ... คืออะไร? Select into ใช้ในกรณีที่คุณไม่ทราบโครงสร้างตารางล่วงหน้า เขียนได้เร็วกว่าสร้างตารางและคำสั่งแทรกดังนั้นจึงใช้เพื่อเพิ่มความเร็วในการพัฒนาในบางครั้ง มักใช้เร็วกว่าเมื่อคุณสร้างตารางอุณหภูมิด่วนเพื่อทดสอบสิ่งต่างๆหรือตารางสำรองของแบบสอบถามเฉพาะ (อาจเป็นบันทึกที่คุณกำลังจะลบ) เป็นเรื่องยากที่จะเห็นมันถูกใช้ในรหัสการผลิตที่จะทำงานหลายครั้ง (ยกเว้นตารางชั่วคราว) เนื่องจากจะล้มเหลวหากตารางนั้นมีอยู่แล้ว

บางครั้งมีการใช้อย่างไม่เหมาะสมโดยผู้ที่ไม่รู้ว่ากำลังทำอะไรอยู่ และอาจทำให้เกิดความเสียหายในฐานข้อมูลได้ ฉันรู้สึกว่าไม่เหมาะสมอย่างยิ่งที่จะใช้ SELECT INTO สำหรับสิ่งอื่นที่ไม่ใช่ตารางการทิ้ง (การสำรองข้อมูลชั่วคราวตารางชั่วคราวที่จะหายไปเมื่อสิ้นสุด proc ที่จัดเก็บไว้เป็นต้น) ตารางถาวรต้องใช้ความคิดที่แท้จริงในการออกแบบและ SELECT INTO ทำให้ง่ายต่อการหลีกเลี่ยงการคิดถึงสิ่งใด ๆ แม้จะเป็นพื้นฐานเช่นคอลัมน์อะไรและประเภทข้อมูลใด

โดยทั่วไปฉันชอบการใช้คำสั่งสร้างตารางและแทรก - คุณมีการควบคุมมากกว่าและดีกว่าสำหรับกระบวนการที่ทำซ้ำได้ นอกจากนี้หากตารางเป็นตารางถาวรควรสร้างจากสคริปต์สร้างตารางแยกต่างหาก (ซึ่งอยู่ในการควบคุมแหล่งที่มา) เนื่องจากการสร้างวัตถุถาวรไม่ควรโดยทั่วไปในโค้ดคือการแทรก / ลบ / อัปเดตหรือเลือกจาก a ตาราง. การเปลี่ยนแปลงออบเจ็กต์ควรได้รับการจัดการแยกต่างหากจากการเปลี่ยนแปลงข้อมูลเนื่องจากอ็อบเจ็กต์มีผลกระทบเกินความต้องการของการแทรก / อัปเดต / เลือก / ลบเฉพาะ คุณต้องพิจารณาประเภทข้อมูลที่ดีที่สุดคิดถึงข้อ จำกัด ของ FK PK และข้อ จำกัด อื่น ๆ พิจารณาข้อกำหนดในการตรวจสอบคิดถึงการจัดทำดัชนี ฯลฯ


5

ความแตกต่างหลักคือ SELECT INTO MyTable จะสร้างตารางใหม่ชื่อ MyTable พร้อมผลลัพธ์ในขณะที่ INSERT INTO ต้องการให้ MyTable มีอยู่แล้ว

คุณจะใช้ SELECT INTO เฉพาะในกรณีที่ไม่มีตารางและคุณต้องการสร้างตามผลลัพธ์ของแบบสอบถามของคุณ ดังนั้นทั้งสองงบจึงเทียบกันไม่ได้จริงๆ พวกเขาทำสิ่งที่แตกต่างกันมาก

โดยทั่วไปแล้ว SELECT INTO จะใช้บ่อยกว่าสำหรับงานทีละงานในขณะที่ INSERT INTO ถูกใช้เป็นประจำเพื่อเพิ่มแถวในตาราง

แก้ไข:
ในขณะที่คุณสามารถใช้ CREATE TABLE และ INSERT INTO เพื่อบรรลุสิ่งที่ SELECT INTO ทำโดยที่ SELECT INTO คุณไม่จำเป็นต้องรู้คำจำกัดความของตารางล่วงหน้า SELECT INTO อาจรวมอยู่ใน SQL เนื่องจากทำให้งานเช่นการรายงานเฉพาะกิจหรือการคัดลอกตารางทำได้ง่ายขึ้นมาก


CREATE TABLE และ SELECT INTO ค่อนข้างเหมือนกัน (ไม่จำเป็นต้อง INSERT INTO เป็นส่วนเสริมเพื่อให้บรรลุสิ่งที่ SELECT INTO ทำ) และฉันคิดว่าไม่แนะนำให้เลือก INTO ดูdba.stackexchange.com/questions/156105/… .
ริก

4

แต่ละคำสั่งมีกรณีการใช้งานที่แตกต่างกัน ไม่สามารถใช้แทนกันได้

SELECT...INTO MyTable...สร้างใหม่MyTableโดยที่ไม่เคยมีมาก่อน

INSERT INTO MyTable...SELECT...ใช้เมื่อMyTableมีอยู่แล้ว


4
คุณไม่ได้ตอบคำถามของฉันและฉันได้ระบุคำตอบของคุณแล้ว
jowenece

5
คำตอบสำหรับคำถามของคุณเป็นนัย เพื่อให้ชัดเจนขึ้นจึงไม่มีคำสั่ง "ที่ดีกว่า" เนื่องจากแต่ละข้อมีกรณีการใช้งานที่แตกต่างกัน งบใช้แทนกันไม่ได้ ใช้เวอร์ชันแรกเมื่อคุณต้องการสร้างตารางใหม่ที่ไม่มีอยู่ ใช้เวอร์ชันที่สองเมื่อมีตารางอยู่แล้ว
Joe Stefanelli

2
ทำไมฉันถึงต้องการทำเช่นนั้นเทียบกับการสร้างตารางชั่วคราวแล้วแทรกลงไป มีข้อได้เปรียบ?
jowenece

4

จริงๆแล้วSELECT ... INTOไม่เพียง แต่สร้างตาราง แต่จะล้มเหลวหากมีอยู่แล้วดังนั้นโดยพื้นฐานแล้วครั้งเดียวที่คุณจะใช้คือเมื่อไม่มีตารางที่คุณกำลังแทรกอยู่

เกี่ยวกับการแก้ไขของคุณ:

โดยส่วนตัวแล้วฉันใช้SELECT ... INTO เป็นหลักเมื่อฉันสร้างตารางชั่วคราว สำหรับฉันคือการใช้งานหลัก อย่างไรก็ตามฉันยังใช้มันเมื่อสร้างตารางใหม่ที่มีหลายคอลัมน์ที่มีโครงสร้างคล้ายกับตารางอื่นแล้วแก้ไขเพื่อประหยัดเวลา


1
ฉันเห็นการใช้ SELECT..INTO สำหรับตารางชั่วคราวเป็นหลักเช่นกัน แต่มีเหตุผลที่จะชอบมากกว่าการสร้างตารางชั่วคราวด้วยคำสั่ง CREATE TABLE หรือไม่ เช่น - เพิ่มประสิทธิภาพ?
jowenece

3
@jowenece ฉันคิดว่าเพื่อความเรียบง่ายเป็นหลัก ... ยังบอกว่าคุณมีแบบสอบถามแบบไดนามิก ฉันไม่รู้โครงสร้างคุณไม่สามารถสร้างตารางก่อนลงมือได้และการใช้ SELECT ... INTO นั้นง่ายกว่าการสร้างตารางแบบไดนามิค
AJC

3

โดยทั่วไปแล้ว SELECT INTO จะใช้เพื่อสร้างตารางชั่วคราวหรือเพื่อคัดลอกตารางอื่น (ข้อมูลและ / หรือโครงสร้าง)

ในโค้ดแบบวันต่อวันคุณใช้ INSERT เนื่องจากตารางของคุณควรมีไว้ให้อ่าน UPDATEd DELETEd JOINed และอื่น ๆ หมายเหตุ: คีย์เวิร์ด INTO เป็นตัวเลือกเสริมด้วย INSERT

นั่นคือโดยปกติแอปพลิเคชันจะไม่สร้างและวางตารางเป็นส่วนหนึ่งของการทำงานปกติเว้นแต่จะเป็นตารางชั่วคราวสำหรับการใช้งานที่ จำกัด และเฉพาะบางขอบเขต

ตารางที่สร้างโดย SELECT INTO จะไม่มีคีย์หรือดัชนีหรือข้อ จำกัด ต่างจากตารางจริงที่มีอยู่แล้วที่มีอยู่แล้ว

2 ไม่สามารถเทียบเคียงได้โดยตรงเนื่องจากแทบไม่มีการใช้งานที่ทับซ้อนกัน


2

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


นั่นเป็นความจริง แต่ส่วนใหญ่เป็นเพราะ SQL Server รู้ว่าไม่มีการโต้แย้งสำหรับตารางปลายทาง การแสดงของinsert into #temp with(tablock) select * from ..จะใกล้เคียงกับการแสดงสำหรับselect * into #temp from ...
Brian

1

เลือกลงในสร้างตารางใหม่ให้คุณในเวลานั้นจากนั้นแทรกระเบียนจากตารางต้นทาง ตารางที่สร้างขึ้นใหม่มีโครงสร้างเช่นเดียวกับตารางต้นทางหากคุณพยายามใช้ select into สำหรับตารางที่มีอยู่จะทำให้เกิดข้อผิดพลาดเนื่องจากจะพยายามสร้างตารางใหม่ด้วยชื่อเดียวกัน แทรกลงในตารางจะต้องมีอยู่ในฐานข้อมูลของคุณก่อนที่คุณจะแทรกแถวลงไป


1

ความแตกต่างง่ายๆระหว่าง Select Into และ Insert Into คือ -> Select Into ไม่จำเป็นต้องมีตารางที่มีอยู่ หากคุณต้องการคัดลอกข้อมูลตาราง A คุณเพียงพิมพ์ Select * INTO [tablename] จาก A ที่นี่ชื่อตารางสามารถเป็นตารางที่มีอยู่หรือตารางใหม่จะถูกสร้างขึ้นซึ่งมีโครงสร้างเหมือนกันเช่นตาราง A

-> แทรกลงในไม่จำเป็นต้องมีตารางที่มีอยู่ INSERT INTO [ชื่อตาราง] เลือก * จาก A; tablename คือตารางที่มีอยู่

Select Into มักเป็นที่นิยมในการคัดลอกข้อมูลโดยเฉพาะข้อมูลสำรอง

คุณสามารถใช้ได้ตามความต้องการของคุณซึ่งเป็นตัวเลือกสำหรับนักพัฒนาโดยสิ้นเชิงซึ่งควรใช้ในสถานการณ์ของเขา

การแทรก INTO ที่ชาญฉลาดเป็นไปอย่างรวดเร็ว

อ้างอิง:

https://www.w3schools.com/sql/sql_insert_into_select.asp https://www.w3schools.com/sql/sql_select_into.asp


-2

การเลือกชุดข้อมูลขนาดใหญ่อาจเหมาะสำหรับผู้ใช้คนเดียวโดยใช้การเชื่อมต่อเดียวกับฐานข้อมูลที่ทำงานจำนวนมาก ฉันไม่แนะนำให้ใช้

SELECT * INTO table

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

เพื่อพิสูจน์แนวคิดเปิด 2 เซสชันในเซสชั่นแรกลองใช้

select into temp table from a huge table 

และในส่วนที่สองพยายามที่จะ

create a temp table 

และตรวจสอบการล็อกการบล็อกและระยะเวลาของเซสชันที่สองเพื่อสร้างวัตถุตารางชั่วคราว คำแนะนำของฉันเป็นแนวทางปฏิบัติที่ดีเสมอในการสร้างและแทรกคำสั่งและหากจำเป็นสำหรับการบันทึกน้อยที่สุดให้ใช้แฟล็กการติดตาม 610

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