本文導讀:Insert 是T-sql中常用語句,但我們在開發中經常會遇到需要表復制的情況,如將一個table1的數據的部分字段復制到table2中,或者將整個 table1復制到table2中,這時候我們就要使用SELECT INTO 和 INSERT INTO SELECT 表復制語句了。select into from 和 insert into select都是用來復制表,兩者的主要區別為: select into from 要求目標表不存在,因為在插入時會自動創建。insert into select from 要求目標表存在。
INSERT INTO SELECT語句
語句形式為:
Insert into Table2(field1,field2,...) select value1,value2,... from Table1
注意地方:
- 要求目標表Table2必須存在,並且字段field,field2...也必須存在
- 注意Table2的主鍵約束,如果Table2有主鍵而且不為空,則 field1, field2...中必須包括主鍵
- 注意語法,不要加values,和插入一條數據的sql混了,不要寫成: Insert into Table2(field1,field2,...) values (select value1,value2,... from Table1)
- 由於目標表Table2已經存在,所以我們除了插入源表Table1的字段外,還可以插入常量。
SELECT INTO FROM語句
語句形式為:SELECT vale1, value2 into Table2 from Table1.要求目標表Table2不存在,因為在插入時會自動創建表Table2,並將Table1中指定字段數據復制到Table2中 。
TRUNCATE TABLE和DELETE FROM區別
TRUNCATE TABLE 和不帶 WHERE 的 DELETE 功能是一樣的,都是刪除表中的所有數據,不過 TRUNCATE TABLE 速度更快,占用的日志更少,這是因為 TRUNCATE TABLE 直接釋放數據頁並且在事務日志中也只記錄數據頁的釋放,而 DELETE 是一行一行地刪除,在事務日志中要記錄每一條記錄的刪除。
那么可不可以用 TRUNCATE TABLE 代替不帶 WHERE 的 DELETE 呢?在以下情況是不行的:
- 要保留標識的情況下不能用 TRUNCATE TABLE,因為 TRUNCATE TABLE 會重置標識。
- 需要使用觸發器的情況下不能使用 TRUNCATE TABLE ,它不會激發觸發器。
- 對於由 FOREIGN KEY 約束引用的表(即主鍵所在的表,不是外鍵所在的表)不能使用 TRUNCATE TABLE。
- 對於參與了索引視圖的表不能使用 TRUNCATE TABLE ,注意指索引視圖,並非普通視圖。
Truncate是SQL中的一個刪除數據表內容的語句,用法是:
TRUNCATE TABLE [Table Name]
具有聚集索引的視圖成為索引視圖;必須先為視圖創建聚集索引,然后才能為該視圖定義其他索引,因為在創建其他索引的時候,SQL SERVER, 會重建表是的非聚集索引。