2014-01-10 37 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的数据文件中不存在现有空间,则此解决方案运行速度可能会更快。但是,如果使用完全恢复模式,则会产生日志空间。