2012-05-17 55 views
4

是什麼在制約**從舊錶中選擇和插入的區別?

SELECT INTO語句

SELECT column1, column2, someInt, someVarChar 
INTO ItemBack1 
FROM table2 
WHERE table2.ID = 7 

插入into語句

INSERT INTO table1 (column1, column2, someInt, someVarChar) 
SELECT table2.column1, table2.column2, 
FROM table2 
WHERE table2.ID = 7 

這些方面的差異Create table ramm as select * from rammayan

編輯1:

數據庫SQL Server 2008中

+0

哪個RDBMS您使用的?行爲上可能存在差異 –

+0

您是否嘗試過第三種選擇?這兩個語句沒有在我的SQL Server 2008 R2中編譯:CREATE TABLE test1(ID int); CREATE TABLE test2 AS SELECT * FROM test1;'。錯誤是在關鍵字'AS'附近有錯誤的語法。 –

+0

對不起,這是我錯過寫的oracle語法 – Trikaldarshi

回答

8

我將在這裏假設MySQL。

前兩個是相同的,如documentation所述。

第三條語句允許創建表格,儘管你的語法在那裏是錯誤的;請查看right syntax瞭解更多信息。

更新

這是SQL服務器= P

SELECT column1, column2, someInt, someVarChar 
INTO ItemBack1 
FROM table2 
WHERE table2.ID = 7 

第一條語句將自動創建ItemBack1表的基礎上,table2

INSERT INTO table1 (column1, column2, someInt, someVarChar) 
SELECT table2.column1, table2.column2, 
FROM table2 
WHERE table2.ID = 7 

第二第二條語句要求table1已經存在。

參見:http://blog.sqlauthority.com/2007/08/15/sql-server-insert-data-from-one-table-to-another-table-insert-into-select-select-into-table/


如果有在限制任何區別,那將是因爲第二條語句取決於您已經創建了什麼(如果表填充等)。

順便說一下,第三個聲明是Oracle(tm),並且與第一條語句相同。

2

我真的不明白你的問題。讓我們嘗試:

第1個將列「someVarChar」的值選擇到名爲「ItemBack1」的變量中。根據你的SQL-Server(mysql/oracle/mssql /等),你現在可以用這個變種做一些邏輯。

第二屆一個插入的

SELECT table2.column1, table2.column2, 8, 'some string etc.' 
FROM table2 
WHERE table2.ID = 7 

結果到表1(複製)

表示第3次創建新表「拉姆」作爲表的副本「rammayan」

3

SELECT INTO - >創建一經選擇執行飛行表

插入進 - >假定表DB已經存在

最後

創建,只是簡單地創建該表查詢返回結果

1

Generally speaking 每一個有其自身的特點,一個創建一個臨時表,另一個使用先前存在的表,第三個創建一個具有完全相同結構和格式的新表。

SELECT ... INTO在默認文件組中創建一個新表,並插入結果從查詢行到它

INSERT INTO:填補了一個已經存在的表 INSERT...INTO

第三個選項被稱爲CTAS(CREATE TABLE AS選擇)做一個搜索,你會得到噸有用的鏈接。基本上它創建了一個表,而不是臨時表,它具有SELECT語句中使用的結構和類型。

我想添加更多的鏈接,但因爲我是新用戶,我只允許發佈2個鏈接來防止垃圾郵件。

1

SELECT INTO和INSERT之間有一些非常重要的區別。

首先,對於INSERT,您需要預先定義目標表。 SELECT INTO創建該表作爲語句的一部分。

其次,作爲第一個條件的結果,您可以使用INSERT將加載時的類型轉換錯誤導入到表中。 SELECT INTO不會發生這種情況(儘管底層查詢可能會產生錯誤)。

第三,使用SELECT INTO您需要提供所有列名稱。用INSERT,你不需要給他們名字。

第四,SELECT INTO在處理過程中鎖定了一些元數據。這意味着對數據庫的其他查詢可能被鎖定在訪問表之外。例如,由於此鎖定,您不能在同一個數據庫上同時運行兩個SELECT INTO語句。第五,在一個非常大的插入中,有時可以看到INSERT的進展,但是不能用SELECT INTO。至少,這是我的經驗。

當我有一個複雜的查詢,我希望把數據放到一個表,我經常使用:

SELECT top 0 * 
INTO <table> 
FROM <query> 

INSERT INTO <table> 
    SELECT * FROM <query> 
0

INSERT INTO SELECT插入到現有的表。

SELECT INTO創建一個新表並將數據放入其中。 查詢中的所有列都必須命名,以便表中的每個列都有一個名稱。這是我看到的這個命令最常見的錯誤。

數據類型和可空性來自源查詢。 如果其中一個源列是標識列並滿足某些條件(例如查詢中沒有JOIN),則新表中的列也將是標識。

INSERT INTO SELECT

CREATE TABLE ExistingTableName1 (ColumnName VARCHAR(255)); 
GO 
INSERT 
INTO ExistingTableName1 
SELECT ColumnaName 
FROM ExistingTableName2; 
GO 

SELECT INTO INSERT

SELECT ColumnName INTO NewTableName 
FROM ExistingTableName1; 
GO