删除后将数据从表传输到表

时间:2014-01-10 14:12:56

标签: sql sql-server database stored-procedures

我有一张桌子,让我们假设它是这样的:

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

是吗?或者有一个更好的查询,所以我可以在一行或更好的表现?

感谢。

2 个答案:

答案 0 :(得分:1)

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

当您使用SELECT执行INSERT操作时,最佳做法是在INSERT INTOSELECT语句中明确提及列名,以确保正确的数据落在右列中。

转移数据后,您可以使用DeleteTruncate命令删除table1中的数据。请记住,您可以使用带有WHERE子句的delete命令限制要删除的数量或行数。

如果要删除table1中的所有记录,只需使用Truncate命令。这更快,记录更少的日志,你不能​​使用WHERE Cluase与truncate。它还会重置您表中的Identity列。

答案 1 :(得分: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的数据文件中不存在现有空间,则此解决方案可能会运行得更快。但是,如果使用完全恢复模型,则会产生日志空间。