在SQL(结构化查询语言)中,插入记录是数据库操作中最基本且频繁使用的功能之一,主要用于向数据库表中的添加新的数据行,SQL中插入记录的核心命令是INSERT INTO,该命令允许用户按照表的结构向指定列插入数据,同时支持多种灵活的插入方式,以满足不同的业务需求,本文将详细介绍INSERT INTO命令的语法、使用方法、注意事项以及常见场景,帮助读者全面掌握SQL中插入记录的操作。

INSERT INTO命令的基本语法
INSERT INTO命令的基本语法结构如下:
INSERT INTO 表名 (列1, 列2, 列3, ...) VALUES (值1, 值2, �3, ...);
表名:指定要插入数据的表,必须为数据库中已存在的表。(列1, 列2, 列3, ...):可选参数,指定要插入数据的列名,如果省略,则默认为表的所有列,但需确保VALUES子句中的值顺序与表中列的顺序完全一致。VALUES (值1, 值2, 倃3, ...):必选参数,提供要插入的具体数据值,值的数量、类型和顺序必须与列名子句中的列一一对应。
假设有一个名为students的表,包含id(学号)、name(姓名)、age(年龄)和gender(性别)四列,向该表插入一条新记录的SQL语句为:
INSERT INTO students (id, name, age, gender) VALUES (1, '张三', 18, '男');
INSERT INTO命令的常见用法
-
插入部分列的数据
如果某些列允许为空(NULL)或设置了默认值,可以只插入部分列的数据。students表中的id列可能为主键且自增,此时无需手动插入id值:INSERT INTO students (name, age, gender) VALUES ('李四', 19, '女'); -
插入多行数据
部分数据库(如MySQL、SQL Server)支持一次性插入多行数据,语法为:
(图片来源网络,侵删)INSERT INTO 表名 (列1, 列2, ...) VALUES (值1_1, 值1_2, ...), (值2_1, 值2_2, ...), ...;
INSERT INTO students (name, age, gender) VALUES ('王五', 20, '男'), ('赵六', 21, '女'); -
从其他表插入数据
使用INSERT INTO ... SELECT语句可以从一个或多个表中查询数据并插入到目标表中,语法为:INSERT INTO 目标表 (列1, 列2, ...) SELECT 列1, 列2, ... FROM 源表 WHERE 条件;
将
temp_students表中年龄大于18岁的学生插入到students表:INSERT INTO students (name, age, gender) SELECT name, age, gender FROM temp_students WHERE age > 18;
数据类型与约束的注意事项
插入数据时,必须确保值的类型与列的数据类型兼容,否则会报错。
- 数值型列(如
INT、DECIMAL)不能插入字符串。 - 日期型列(如
DATE、DATETIME)需符合特定格式(如'2023-10-01')。 - 字符串和日期值需用单引号()包围,数值则无需引号。
还需注意表的约束条件:

- 主键约束:主键列的值必须唯一且非空,如果插入重复的主键值,数据库会拒绝操作并报错。
- 外键约束:插入的外键值必须在被引用的表中存在,否则会违反参照完整性。
- 非空约束:具有
NOT NULL约束的列必须提供值,否则插入失败。 - 唯一约束:具有
UNIQUE约束的列不能插入重复值。
使用表格总结INSERT INTO命令的常见场景
| 场景 | SQL示例 | 说明 |
|---|---|---|
| 插入完整行数据 | INSERT INTO students VALUES (1, '张三', 18, '男'); |
省略列名时,需按表列顺序提供所有值 |
| 插入部分列数据 | INSERT INTO students (name, age) VALUES ('李四', 19); |
适用于有默认值或允许NULL的列 |
| 插入多行数据 | INSERT INTO students VALUES (2, '王五', 20, '男'), (3, '赵六', 21, '女'); |
需数据库支持多行插入语法 |
| 从查询插入数据 | INSERT INTO students SELECT * FROM temp_students WHERE id = 1; |
将查询结果批量插入目标表 |
相关问答FAQs
Q1: 如果插入的数据违反了主键约束,会发生什么?
A1: 当插入的数据导致主键列出现重复值或主键列为NULL时,数据库会拒绝该操作并返回错误提示,在students表中尝试插入id为1的重复记录时,MySQL会报错:Duplicate entry '1' for key 'PRIMARY',解决方法包括检查数据唯一性或使用ON DUPLICATE KEY UPDATE语法(MySQL)覆盖已有数据。
Q2: 如何在插入数据时自动生成时间戳?
A2: 如果表中包含DATETIME或TIMESTAMP类型的列(如create_time),可以在插入数据时使用数据库函数自动生成当前时间,在MySQL中:
INSERT INTO students (name, age, gender, create_time)
VALUES ('钱七', 22, '男', NOW());
create_time列的值会被设置为当前系统时间,若需在创建表时默认自动填充时间,可在列定义中使用DEFAULT CURRENT_TIMESTAMP。
