我有一张桌子,让我们假设它是这样的:
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 :(得分:1)
INSERT INTO table_2 (id,name,salary)
SELECT id,name,salary
FROM dbo.table1
当您使用SELECT执行INSERT操作时,最佳做法是在INSERT INTO
和SELECT
语句中明确提及列名,以确保正确的数据落在右列中。
转移数据后,您可以使用Delete
或Truncate
命令删除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的数据文件中不存在现有空间,则此解决方案可能会运行得更快。但是,如果使用完全恢复模型,则会产生日志空间。