2011-08-04 375 views
93

有什麼用INSERT INTO VS SELECT INTO

SELECT ... INTO MyTable FROM... 

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

之間的區別?

從BOL [INSERTSELECT...INTO],我都知道,使用SELECT ... INTO將在默認文件組創建插入表如果它不存在,而且此語句記錄取決於數據庫的恢復模型。

  1. 哪種說法更可取?
  2. 是否有其他性能影響?
  3. 什麼是SELECT ... INTO通過INSERT INTO ...的良好用例?

編輯:我已經說過,我知道那個SELECT INTO ...創建一個表,它不存在。我想知道的是,SQL包含此聲明的原因是什麼?它是在插入行後面做一些不同的事情嗎?或者它只是在CREATE TABLEINSERT INTO之上的語法糖。

+0

一個小的因素:'INSERT INTO'有兩個關鍵詞(選擇和進入)擺在最前頭,讓全世界都知道這不是普通的SQL語句,而' SELECT ... INTO'至少開始看起來像普通的SQL語句。贊成前者的一個小理由。 –

回答

90
  1. 他們做不同的事情。表格存在時使用INSERT。否則使用SELECT INTO

  2. 是的。通常會記錄INSERT,但沒有表提示。假設適當的跟蹤標誌被設置,SELECT INTO被最小化記錄。

  3. 根據我的經驗,SELECT INTO最常用於中間數據集,比如#temp表,或者複製出一個像備份一樣的整個表。 INSERT INTO用於插入已知結構的現有表中。

編輯

爲了解決您的編輯,他們做不同的事情。如果您正在製作表格並想要定義結構,請使用CREATE TABLEINSERT。可以創建的問題示例:您有一個帶有varchar字段的小表。表中最大的字符串現在是12個字節。您的真實數據集最多需要200個字節。如果您從小表中執行SELECT INTO以創建新表,則後面的INSERT將因截斷錯誤而失敗,因爲您的字段太小。

+3

我的兩分錢,我認爲介紹失敗是件好事。我想知道我的數據是否與我預期的數據格式/大小不符。我總是試着用'CREATE TABLE'和'INSERT INTO'來定義我的表,而且,不用執行插入就可以更簡單地測試'SELECT'語句。 –

+0

@Doug - 我同意。我幾乎完全使用'SELECT INTO'來創建一個臨時表,或者快速備份一個現有的表,我將要使用它。 – JNK

+0

@JNK - 從BOL中,SELECT INTO根據選擇列表中列的數據類型創建一個具有結構的表。所以在你的例子中,你可以通過明確地將varchar轉換爲足夠大的大小來糾正這種情況。正確? – jowenece

4

每個語句都有一個獨特的用例。它們不可互換。

SELECT...INTO MyTable...創建一個新的MyTable其中一個以前不存在。

INSERT INTO MyTable...SELECT...用於MyTable已存在。

+3

你沒有回答我的任何問題,我已經說明了你的答案。 – jowenece

+4

您的問題的答案是隱含的。爲了更清楚地說明,沒有「優選」的陳述,因爲每個陳述都有獨特的用例。這些陳述不可互換。如果要創建不存在的新表,請使用第一個版本。表格已存在時使用第二個版本。 –

+1

爲什麼我會這樣做vs創建一個臨時表然後插入它?有優勢嗎? – jowenece

2

SELECT INTO通常用於生成臨時表或複製另一個表(數據和/或結構)。

在一天,因爲你的表應該已經存在被讀取,更新,刪除你使用INSERT一天代碼,加盟等。注:INTO關鍵字是可選的INSERT

也就是說,應用程序將無法正常創建和刪除表作爲正常操作的一部分,除非它是用於某些範圍限制和特定用法的臨時表。

通過SELECT INTO創建將有不同於真正的無鍵或索引或約束的表,堅持,現有的表

的2沒有直接可比性,因爲他們在使用中幾乎沒有重疊

4

主要區別在於SELECT INTO MyTable將使用結果創建一個名爲MyTable的新表,而INSERT INTO要求MyTable已經存在。

只有在表不存在的情況下才可以使用SELECT INTO,並且您希望根據查詢結果創建它。因此,這兩種說法確實不具可比性。他們做了非常不同的事情。

通常,SELECT INTO更經常用於一個關閉任務,而INSERT INTO則定期用於向表中添加行。

編輯:
雖然可以使用CREATE TABLE和INSERT INTO完成什麼SELECT INTO確實,與SELECT INTO你不必事先知道表定義。 SELECT INTO可能包含在SQL中,因爲它使得臨時報告或複製表等任務變得更加容易。

4

其實SELECT ... INTO不僅創建表,但如果它已經存在,將失敗,所以基本上唯一一次使用它是當你插入的表不存在。

在問候你的編輯:

我個人主要使用SELECT ... INTO當我創建一個臨時表。這對我來說是主要用途。但是,當創建具有與其他表類似的結構的許多列的新表時,我還會使用它,然後對其進行編輯以節省時間。

+0

我主要看到SELECT..INTO用於臨時表的使用,但有沒有理由更喜歡用CREATE TABLE語句創建臨時表?例如。 - 性能增益? – jowenece

+1

@jowenece我認爲主要是爲了簡單...也說你有一個動態查詢。我不知道結構,你無法事先創建表格,而且使用SELECT ... INTO比使用表格創建表格要容易得多。 – AJC

15
  1. 哪種說法更可取?取決於你在做什麼。

  2. 還有其他的性能影響?如果該表是一個permananent表,則可以在創建表時創建索引,這些索引對性能既有負面影響,也有正面影響。選入不會重新創建當前表上存在的索引,因此表的後續使用可能比需要的慢。

  3. 在INSERT INTO什麼是一個很好的使用情況SELECT ... INTO ...?如果您事先不知道表結構,則使用選擇進入。寫入速度比創建表格和嵌入式腳本要快,所以它有時用於加速開發。在創建快速臨時表來測試特定查詢的事物或備份表(可能是要刪除的記錄)時,使用它通常會更快。應該很少見到它會在多次運行的生產代碼中使用(臨時表除外),因爲如果表已經存在,它將會失敗。

它有時被不知道自己在做什麼的人不適當地使用。因此,他們可能會在數據庫中造成嚴重破壞。我強烈地感覺到將SELECT INTO用於除一次性表之外的其他任何東西(臨時備份,臨時表將在存儲過程結束時消失等)是不合適的。永久表需要真正的想法至於他們的設計和SELECT INTO可以很容易地避免思考任何事情,甚至像什麼列和什麼樣的數據類型一樣基本。

通常,我更喜歡使用create table和insert語句 - 您擁有更多的控制權,並且對於可重複的流程來說更好。此外,如果表是永久性表,則應該從獨立的創建表腳本(源代碼管理中的一個腳本)創建,因爲創建永久對象通常不應插入/刪除/更新或從中選擇一張桌子。對象更改應與數據更改分開處理,因爲對象具有超出特定插入/更新/選擇/刪除需求的含義。您需要考慮最佳數據類型,您需要考慮FK約束和PK等約束條件,您需要考慮審計要求,您需要考慮索引等。

0

選擇進入爲您創建新表時間,然後從源表中插入記錄。新創建的表具有與源表相同的結構。如果嘗試將select into用於現有表,則會產生錯誤,因爲它會嘗試使用相同名稱創建新表。 在插入行之前,插入需要在數據庫中存在該表。

0

我只想涵蓋與性能相關的問題的第二點,因爲沒有其他人已經覆蓋了這一點。當涉及到大型數據集的表格時,選擇入入比插入要快得多。當我必須閱讀一個非常大的表格時,我更喜歡選擇進入。插入一行1000萬行可能需要幾個小時,而選擇將在幾分鐘內做到這一點,而對於新表損失索引來說,您可以通過查詢重新創建索引,並且仍然可以節省更多的時間插入。

+0

的確如此,但這主要是因爲SQL Server知道目標表沒有爭用。用(tablock)select * from ..'插入到#temp的性能與'select * into #temp from ...'的性能大致相同 – Brian

-1

對於大型數據集的選擇可能僅適用於單個用戶使用單個連接執行批量操作任務的數據庫。我不建議使用

SELECT * INTO table 

因爲這會產生一個大的交易,並創建模式鎖來創建對象,防止其他用戶,直到SELECT INTO操作完成創建對象或訪問系統對象。

作爲概念開2次會議的證明,在第一屆會議上嘗試使用

select into temp table from a huge table 

,並在第二節試圖

create a temp table 

,並檢查門鎖,阻止和第二的持續時間會話來創建臨時表對象。我的建議是創建和插入語句,如果需要最小化日誌記錄使用跟蹤標誌610,則始終是一個好習慣。

0

選擇插入和插入的簡單區別是: - >選擇不需要存在表。如果你想複製表A的數據,你只需在A中輸入Select * INTO [tablename]。在這裏,tablename可以是現有的表格,或者將創建具有與表格A相同的結構的新表格。

- > Insert Into do需要存在table.INSERT INTO [tablename] SELECT * FROM A ;. 這裏tablename是一個現有的表。

Select Into通常比較流行復制數據,尤其是備份數據。

您可以按照您的要求使用,這完全是開發人員的選擇,應該在他的場景中使用。

性能明智插入INTO速度很快。

參考文獻:

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