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 ('张三', '[email protected]', 25, 'China');
2. 省略部分列
可以省略有 DEFAULT 值的列:
-- age 和 country 有默认值,可以省略
INSERT INTO users (name, email)
VALUES ('李四', '[email protected]');
执行后:
- age 默认值为 18
- country 默认值为 'China'
3. 插入多条数据
INSERT INTO users (name, email, age, country)
VALUES
('王五', '[email protected]', 28, 'China'),
('赵六', '[email protected]', 35, 'USA'),
('孙七', '[email protected]', 25, 'UK');
4. 不指定列名
如果插入所有列的值,可以省略列名:
INSERT INTO users
VALUES (NULL, '周八', '[email protected]', 30, 'Japan', NOW());
注意:必须按照表中列的顺序插入值,且需要包含所有列。
特殊值插入
自动递增
-- id 设置为 NULL 或 0,会自动生成
INSERT INTO users (name, email)
VALUES ('吴九', '[email protected]');
INSERT INTO users (id, name, email)
VALUES (0, '郑十', '[email protected]');
当前时间戳
-- created_at 有默认值 CURRENT_TIMESTAMP
INSERT INTO users (name, email)
VALUES ('钱十一', '[email protected]');
NULL 值
-- 显式插入 NULL
INSERT INTO users (name, email, age)
VALUES ('陈十二', '[email protected]', 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 ('张三', '[email protected]');
-- Error: Duplicate entry '[email protected]' 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 ('张三', '[email protected]');
MySQL 特有的语法
ON DUPLICATE KEY UPDATE
如果存在则更新,不存在则插入:
INSERT INTO users (name, email, age)
VALUES ('张三', '[email protected]', 26)
ON DUPLICATE KEY UPDATE age = 26;
REPLACE
如果存在则删除再插入:
REPLACE INTO users (name, email, age)
VALUES ('张三', '[email protected]', 26);
小结
本章我们学习了:
- INSERT 基本语法
- 插入单条和多条数据
- 省略列和使用默认值
- INSERT INTO ... SELECT 复制数据
练习
- 创建一个员工表,包含姓名、部门、薪资
- 插入5条员工数据
- 使用一条语句插入3条数据
- 从一个表复制数据到另一个表