菜鸟科技网

SQL插入数据命令的语法是什么?

INSERT INTO 是 SQL 的核心数据操作语言(DML)之一,用于向数据库表中的行添加新的数据记录。

SQL插入数据命令的语法是什么?-图1
(图片来源网络,侵删)

基本语法

INSERT INTO 命令有两种主要的语法形式。

插入完整的行(不指定列名)

当你需要为表中的所有列都提供值时,可以使用这种语法,值的顺序必须与表定义中列的顺序完全一致。

INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);

注意:虽然很多数据库允许省略列名列表,但这是一种非常不推荐的做法,因为它会使代码变得脆弱,容易因表结构的改变而出错。

插入部分列(指定列名)

这是最常用和最安全的语法,你只需要为你想要赋值的列指定列名,值的顺序需要与列名列表的顺序对应,这种方式有以下优点:

SQL插入数据命令的语法是什么?-图2
(图片来源网络,侵删)
  • 灵活性:可以为某些列(如自增ID、有默认值的列)省略值。
  • 可维护性:即使表增加了新的列,只要你不为新列提供值,现有代码通常也能正常工作。
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);

详细示例

假设我们有一个名为 Students 的学生表,其结构如下:

CREATE TABLE Students (
    StudentID INT PRIMARY KEY AUTO_INCREMENT, -- 自增主键
    FirstName VARCHAR(50) NOT NULL,
    LastName VARCHAR(50) NOT NULL,
    Age INT,
    EnrollmentDate DATE,
    Major VARCHAR(50) DEFAULT 'Undeclared' -- 有默认值的列
);

示例 1:插入所有列的数据

假设我们想插入一个学生的所有信息,包括自增的 StudentID

INSERT INTO Students (StudentID, FirstName, LastName, Age, EnrollmentDate, Major)
VALUES (1, 'John', 'Doe', 20, '2025-09-01', 'Computer Science');

更推荐的做法:省略自增列 StudentID,让数据库自动生成。

INSERT INTO Students (FirstName, LastName, Age, EnrollmentDate, Major)
VALUES ('John', 'Doe', 20, '2025-09-01', 'Computer Science');

数据库会自动为 StudentID 分配下一个可用的值(2)。

SQL插入数据命令的语法是什么?-图3
(图片来源网络,侵删)

示例 2:插入部分列的数据

假设我们只知道一个学生的姓名和年龄,其他信息暂时未知。

INSERT INTO Students (FirstName, LastName, Age)
VALUES ('Jane', 'Smith', 21);

执行此语句后,EnrollmentDateMajor 列将根据表的定义被填充为 NULLMajor 列有 DEFAULT 约束,它将被填充为默认值 'Undeclared'

示例 3:插入带默认值的数据

我们可以显式地使用 DEFAULT 关键字来插入默认值,或者不提供该列的值。

-- 方法一:显式使用 DEFAULT 关键字
INSERT INTO Students (FirstName, LastName, Age, Major)
VALUES ('Peter', 'Jones', 22, DEFAULT);
-- 方法二:省略有默认值的列
INSERT INTO Students (FirstName, LastName, Age)
VALUES ('Peter', 'Jones', 22);

这两种方法的效果是相同的,Major 列的值都会是 'Undeclared'

示例 4:插入字符串和日期值

字符串和日期值必须用单引号 () 括起来。

INSERT INTO Students (FirstName, LastName, Age, EnrollmentDate, Major)
VALUES ('Emily', 'Wang', 19, '2025-02-15', 'Mathematics');

高级用法

插入多行数据

你可以一次性插入多行数据,只需在 VALUES 子句中列出多组值,并用逗号隔开,这比多次执行单行插入效率更高。

INSERT INTO Students (FirstName, LastName, Age, EnrollmentDate, Major)
VALUES
    ('Alice', 'Johnson', 20, '2025-09-01', 'Physics'),
    ('Bob', 'Brown', 21, '2025-09-01', 'Chemistry'),
    ('Charlie', 'Davis', 19, '2025-02-15', 'Biology');

从另一个表插入数据 (INSERT INTO ... SELECT)

你可以从一个表中选择数据,并将这些数据插入到另一个表中,两个表的列结构需要兼容(列数、数据类型匹配)。

场景:假设我们有一个 Alumni (校友) 表,现在要将一些校友转回学生表。

-- 假设 Alumni 表结构与 Students 兼容
INSERT INTO Students (FirstName, LastName, Age, Major)
SELECT FirstName, LastName, Age, Major
FROM Alumni
WHERE GraduationYear IS NULL; -- 只将未毕业的校友转回学生

重要注意事项

  1. 数据类型匹配:插入的值必须与目标列的数据类型兼容,你不能将字符串 'hello' 插入到 INT 类型的列中。
  2. NOT NULL 约束:对于定义为 NOT NULL 的列,你必须提供一个值,否则插入操作会失败。
  3. 主键和唯一约束:插入的值不能违反主键或唯一约束,你不能插入一个与现有记录 StudentID 相同的值。
  4. SQL 注入:当通过应用程序执行 SQL 时,永远不要直接拼接用户输入到 SQL 语句中,这会导致严重的 SQL 注入安全漏洞,应始终使用参数化查询(Prepared Statements)。
    • 错误示例 (易受攻击): sql = "INSERT INTO Students (FirstName) VALUES ('" + userInput + "')"
    • 正确示例 (安全): 使用参数化查询,将用户输入作为参数传递给数据库驱动。
  5. 大小写敏感:字符串值的比较和存储是否区分大小写,取决于数据库的配置和排序规则。

常见错误及解决

错误信息 (常见) 可能原因 解决方案
Column count doesn't match value count INSERT 语句中列的数量与 VALUES 中值的数量不一致。 检查并确保列名列表和值列表中的项目数量相同。
Duplicate entry '...' for key 'PRIMARY' 尝试插入一个与表中现有记录的主键值相同的记录。 检查主键是否应该自增,或者确保插入的主键值是唯一的。
Cannot add or update a child row: a foreign key constraint fails 尝试插入的记录在关联的父表中找不到匹配的值(违反外键约束)。 确保外键列的值在父表中是存在的。
NULL constraint failed: table_name.column_name 尝试将 NULL 值插入到定义为 NOT NULL 的列中。 为该列提供一个非空值,或者修改列定义允许 NULL
Data truncated for column '...' 插入的值长度超过了列定义的最大长度(VARCHAR(10) 插入了 11 个字符)。 缩短字符串值,或者修改列定义以容纳更长的数据。

希望这份详细的指南能帮助你全面掌握 SQL 的 INSERT INTO 命令!

分享:
扫描分享到社交APP
上一篇
下一篇