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);
小结
本章我们学习了:
- INSERT 基本语法
- 插入单条和多条数据
- 省略列和使用默认值
- INSERT INTO ... SELECT 复制数据
练习
- 创建一个员工表,包含姓名、部门、薪资
- 插入5条员工数据
- 使用一条语句插入3条数据
- 从一个表复制数据到另一个表