跳到主要内容

SQL INSERT 插入数据

INSERT 语句用于向表中插入新数据。

基本语法

插入单条数据

INSERT INTO 表名 (1,2,3, ...)
VALUES (1,2,3, ...);

插入多条数据

INSERT INTO 表名 (1,2, ...)
VALUES
(1,2, ...),
(1,2, ...),
(1,2, ...);

演示表结构

假设有 users 表:

CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(50) UNIQUE,
age INT DEFAULT 18,
country VARCHAR(50) DEFAULT 'China',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

插入示例

1. 插入完整数据

INSERT INTO users (name, email, age, country)
VALUES ('张三', 'zhangsan@example.com', 25, 'China');

2. 省略部分列

可以省略有 DEFAULT 值的列:

-- age 和 country 有默认值,可以省略
INSERT INTO users (name, email)
VALUES ('李四', 'lisi@example.com');

执行后:

  • age 默认值为 18
  • country 默认值为 'China'

3. 插入多条数据

INSERT INTO users (name, email, age, country)
VALUES
('王五', 'wangwu@example.com', 28, 'China'),
('赵六', 'zhaoliu@example.com', 35, 'USA'),
('孙七', 'sunqi@example.com', 25, 'UK');

4. 不指定列名

如果插入所有列的值,可以省略列名:

INSERT INTO users
VALUES (NULL, '周八', 'zhouba@example.com', 30, 'Japan', NOW());

注意:必须按照表中列的顺序插入值,且需要包含所有列。

特殊值插入

自动递增

-- id 设置为 NULL 或 0,会自动生成
INSERT INTO users (name, email)
VALUES ('吴九', 'wujiu@example.com');

INSERT INTO users (id, name, email)
VALUES (0, '郑十', 'zhengshi@example.com');

当前时间戳

-- created_at 有默认值 CURRENT_TIMESTAMP
INSERT INTO users (name, email)
VALUES ('钱十一', 'qian@example.com');

NULL 值

-- 显式插入 NULL
INSERT INTO users (name, email, age)
VALUES ('陈十二', 'chen@example.com', NULL);

INSERT INTO ... SELECT

从另一个表复制数据:

-- 复制表数据
INSERT INTO users_backup (name, email, age, country)
SELECT name, email, age, country FROM users;

-- 带条件复制
INSERT INTO adult_users (name, email, age)
SELECT name, email, age FROM users WHERE age >= 18;

常见错误

1. 违反唯一约束

-- 邮箱已存在,会报错
INSERT INTO users (name, email)
VALUES ('张三', 'zhangsan@example.com');
-- Error: Duplicate entry 'zhangsan@example.com' for key 'email'

2. 违反非空约束

-- name 为 NOT NULL,不能为空
INSERT INTO users (name)
VALUES (NULL);
-- Error: Column 'name' cannot be null

3. 字符串缺少引号

-- 错误
INSERT INTO users (name, email)
VALUES (张三, test@example.com);

-- 正确
INSERT INTO users (name, email)
VALUES ('张三', 'test@example.com');

MySQL 特有的语法

ON DUPLICATE KEY UPDATE

如果存在则更新,不存在则插入:

INSERT INTO users (name, email, age)
VALUES ('张三', 'zhangsan@example.com', 26)
ON DUPLICATE KEY UPDATE age = 26;

REPLACE

如果存在则删除再插入:

REPLACE INTO users (name, email, age)
VALUES ('张三', 'zhangsan@example.com', 26);

小结

本章我们学习了:

  1. INSERT 基本语法
  2. 插入单条和多条数据
  3. 省略列和使用默认值
  4. INSERT INTO ... SELECT 复制数据

练习

  1. 创建一个员工表,包含姓名、部门、薪资
  2. 插入5条员工数据
  3. 使用一条语句插入3条数据
  4. 从一个表复制数据到另一个表