2014-01-10 69 views
1

我有一個表,讓我們假定它是這樣的:刪除它們之後,從表中數據傳輸到表

id name  salary 
1  mohamed 2500 
2  ahmed  1800 
3  micheal 3400 

我想所有這些數據傳送到另一臺

log_id id name salary 

其中LOG_ID是一個auto_increment鍵。

是我的嘗試是

select * into table_2 from dbo.table1 
delete from dbo.table1 where 1=1 

是這樣嗎?或者有更好的查詢,所以我可以在一行或更好的性能?

謝謝。

+0

不需要WHERE子句。根據您的需要,TRUNCATE TABLE可能是清空第一個表格的合適方法。 – HABO

+0

是的,它更好,謝謝。 – Adly

回答

1
INSERT INTO table_2 (id,name,salary) 
SELECT id,name,salary 
FROM dbo.table1 

當你做使用選擇它INSERT操作是明確的提及列名INSERT INTOSELECT聲明,只是爲了確保正確的數據,土地在右欄中的最佳實踐。

一旦您傳輸了數據,您可以使用DeleteTruncate命令來刪除表1中的數據。請記住,您可以使用刪除命令限制使用WHERE子句刪除的數字或行。

如果要刪除table1中的所有記錄,只需使用Truncate命令。這是更快,日誌記錄更少,你不能使用WHERE Cluase truncate。它還會重置表格中的標識列。

+1

酷和很好的解釋,謝謝 – Adly

+0

@SELECT_UPDATE不是一個問題很高興它幫助。 –

+1

根據恢復模型(FULL導致大量日誌記錄),刪除命令將事務日誌中的回滾記錄放置在事務日誌中。截斷速度更快,日誌記錄更少。如果DELETE操作大於50%的記錄,可能是SELECT INTO臨時表,放棄原始表。將temp重命名爲原始。像索引一樣添加其他對象。這個選項可能不如從3.5 M記錄表中刪除3.0 M記錄。 –

1

這一切都取決於您的要求。想到兩種方法。

-- 
-- 1 - Create new table on the fly 
-- 

-- Remove existing 
if object_id('table2') > 0 
drop table2; 
go 

-- Create new table (must have rights) 
select * into table2 from table1; 
go 


-- 
-- 2 - Load existing table 
-- 

-- Remove data 
truncate table table2; 
go 

-- Add data 
insert into table2 
select * from table1; 
go 

讓我們談談兩種解決方案的優缺點。

解決方案1即時創建表格。執行代碼的人必須擁有CREATE TABLE的權利。它可以爲您節省事務日誌空間。

http://technet.microsoft.com/en-us/library/ms188029.aspx

在簡單恢復模式或大容量日誌恢復模式,批量操作最小日誌記錄。通過最少的日誌記錄,使用SELECT ... INTO語句可以比創建表格更高效,然後使用INSERT語句填充表格。

解決方案2將數據添加到現有表中。用戶只需要擁有INSERT權限。 使表提前存在允許您執行諸如在文件組上建立表並預先分配文件大小的操作。

如果解決方案1的數據文件中不存在現有空間,則此解決方案運行速度可能會更快。但是,如果使用完全恢復模式,則會產生日誌空間。