SELECT INTO vs INSERT INTO SELECT:SQL表复制语句详解
今天我们来聊聊SQL Server中两种常用的表复制语句,让你轻松应对数据复制场景!
| 必须已存在 | 自动创建 | |
INSERT INTO 目标表(字段1, 字段2)SELECT 字段1, 字段2 FROM 源表
-- 1. 创建测试表CREATE TABLE Table1 (a varchar(10), b varchar(10), c varchar(10))CREATE TABLE Table2 (a varchar(10), c varchar(10), d int)GO-- 2. 插入测试数据INSERT INTO Table1 VALUES('赵', 'asds', '90')INSERT INTO Table1 VALUES('钱', 'asds', '100')INSERT INTO Table1 VALUES('孙', 'asds', '80')GO-- 3. 复制数据(Table2必须存在)INSERT INTO Table2(a, c, d) SELECT a, c, 5 FROM Table1GO-- 4. 查看结果SELECT * FROM Table2
-- 插入常量INSERT INTO Table2(a, c, d) SELECT a, c, 100 FROM Table1-- 带条件复制INSERT INTO Table2(a, c, d) SELECT a, c, 5 FROM Table1 WHERE c > 80
SELECT 字段1, 字段2 INTO 新表 FROM 源表
-- 1. 创建源表CREATE TABLE Table1 (a varchar(10), b varchar(10), c varchar(10))GO-- 2. 插入测试数据INSERT INTO Table1 VALUES('赵', 'asds', '90')INSERT INTO Table1 VALUES('钱', 'asds', '100')INSERT INTO Table1 VALUES('孙', 'asds', '80')GO-- 3. 创建新表并复制数据(Table2自动创建)SELECT a, c INTO Table2 FROM Table1GO-- 4. 查看结果SELECT * FROM Table2
-- 只复制表结构(不复制数据)SELECT * INTO Table2 FROM Table1 WHERE 1=0-- 创建临时表SELECT a, c INTO #TempTable FROM Table1-- 跨数据库复制SELECT * INTO OtherDB.dbo.Table2 FROM CurrentDB.dbo.Table1
-- 快速备份SELECT * INTO Table1_Backup_20240317 FROM Table1
-- 归档2023年前数据SELECT * INTO Orders_Archive FROM Orders WHERE OrderDate < '2023-01-01'DELETE FROM Orders WHERE OrderDate < '2023-01-01'
-- 生成月度报表SELECT YEAR(OrderDate) AS 年份, MONTH(OrderDate) AS 月份, SUM(Amount) AS 总金额INTO 月度报表FROM OrdersGROUP BY YEAR(OrderDate), MONTH(OrderDate)
-- 分批插入避免日志爆满DECLARE @BatchSize INT = 10000WHILE 1=1BEGIN INSERT INTO Table2 SELECT TOP (@BatchSize) * FROM Table1 WHERE ID NOT IN (SELECT ID FROM Table2) IF @@ROWCOUNT < @BatchSize BREAKEND
-- SELECT INTO后手动创建索引SELECT * INTO BigTable_Copy FROM BigTableCREATE INDEX IX_Copy_ID ON BigTable_Copy(ID)
-- 保留IDENTITY属性SELECT IDENTITY(int, 1, 1) AS 新ID, * INTO Table2 FROM Table1
-- 只插入不存在的数据INSERT INTO Table2SELECT * FROM Table1 t1WHERE NOT EXISTS (SELECT 1 FROM Table2 t2 WHERE t2.ID = t1.ID)
-- 使用默认值替代NULLINSERT INTO Table2(col1, col2)SELECT ISNULL(col1, '默认值'), ISNULL(col2, 0) FROM Table1
INSERT INTO SELECT:目标表必须存在,适合追加数据
SELECT INTO:自动创建新表,适合备份和临时表
两种语句都不会复制约束、索引和默认值
大批量操作注意事务日志和锁等待
阅读原文:原文链接