必须会的SQL语句(三) 数据插入
掌握SQL数据插入不仅涉及基础的Insert Into语法,还涵盖多行批量处理、表结构复制及自增字段(Identity)的特殊设置。本文梳理了从规范编写到高级操作的完整流程,确保数据写入既准确又高效。
插入语句的编写规范
在进行SQL数据插入操作时,遵循一定的命名和格式规范可以提高语句的兼容性和可读性:
- 中文字符串前缀:建议在包含中文值的字符串前添加前缀
N,例如N'张三',以确保数据库能正确处理Unicode字符编码。 - 列名隔离:使用方括号
[]包裹列名,尤其是当列名中包含空格、特殊字符或与保留字冲突时,如[user_name]。
常规与多行插入操作
根据数据量的不同,可以选择不同的插入策略来优化数据库性能。
第1步:执行常规单行插入
目的:向现有表中插入一条或多条独立的数据记录。
入口:SQL查询编辑器。
动作:使用标准的 INSERT INTO 语句指定目标表和列名,并通过 VALUES 子句传入对应值。
-- 示例:向 users 表插入姓名和状态
INSERT INTO users
([name], [status])
VALUES (N'张三', 'active');
完成判断:执行后返回受影响行数为1,即表示成功插入。
第2步:通过Union All实现多行批量插入
目的:在单次请求中插入多条数据,减少网络往返开销,提升写入效率。
入口:支持Union语法的SQL环境。
动作:利用 UNION ALL 连接多个 SELECT 语句,每个Select生成一行数据并合并插入。
-- 将多组数据一次性插入 target_table
INSERT INTO target_table ([col1], [col2])
SELECT 'A', '1' UNION ALL
SELECT 'B', '2' UNION ALL
SELECT 'C', '3';
注意参数:UNION 会自动去重,而 UNION ALL 会保留所有重复行。若需全量导入且不介意重复,建议使用 UNION ALL 以获得最佳性能。
第3步:从其他表复制数据至新表
目的:快速克隆表结构或迁移历史数据。
入口:数据库管理工具。
动作:结合 SELECT ... INTO 语法完成。
-- 1. 复制旧表 full_data 的结构和内容到新表 backup_data
SELECT * INTO backup_data FROM full_data;
-- 2. 仅复制表结构(无数据)
-- 方法A:过滤掉所有行
SELECT * INTO empty_table FROM source_table WHERE 1<>1;
-- 方法B:限制顶部0行(部分数据库适用)
SELECT TOP 0 * INTO empty_table FROM source_table;
完成判断:检查新表是否存在且行数符合预期(全量为原表行数,结构仅为空表)。
第4步:向已有表插入外部表数据
目的:将查询结果集直接插入到指定的目标表中,常用于ETL或数据归档。
入口:SQL脚本窗口。
动作:使用 INSERT INTO ... SELECT ... 组合模式,注意目标列与源列的顺序及类型匹配。
INSERT INTO archive_users (id, name)
SELECT user_id, username FROM temp_import_table;
强行写入自增标识字段
对于设置了自动增长(Identity/Auto Increment)的主键列,默认情况下无法直接插入值。若需手动指定ID(例如数据恢复或测试),可按以下步骤操作:
第1步:开启显式值插入权限
目的:解除对自增列 IDENTITY 的写入限制。
动作:设置 IDENTITY_INSERT 为 ON。
-- 允许向 table_name 的 ID 列插入指定值
SET IDENTITY_INSERT table_name ON;
第2步:执行强制插入
动作:在插入语句中显式列出包含自增列在内的所有列名进行赋值。
-- 必须明确写出被插入的列,不能只写 VALUES
INSERT INTO table_name (id, name)
VALUES (1001, N'测试数据');
第3步:关闭权限以恢复常态
目的:防止后续误操作覆盖自增逻辑。
动作:立即将该选项关闭。
-- 重新启用自动增长模式
SET IDENTITY_INSERT table_name OFF;
以上就是SQL数据插入语句的详细操作与进阶技巧,更多关于SQL数据库管理的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













