INSERT 语句实现。以下是常见方法和详细示例:
一、基本 INSERT 语法
1. 指定列名插入
-- 指定列名插入数据(推荐)
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
-- 示例:向 users 表添加用户
INSERT INTO users (id, username, email, created_at)
VALUES (1, 'john_doe', 'john@example.com', '2023-10-01');
2. 省略列名插入(按表结构顺序)
-- 为所有列提供值(需与表结构顺序一致)
INSERT INTO table_name
VALUES (value1, value2, value3, ...);
-- 示例
INSERT INTO products
VALUES (101, 'Laptop', 999.99, 10, 'Electronics');
3. 插入多条数据
-- 批量插入多条记录(高效方式)
INSERT INTO table_name (column1, column2)
VALUES
(value1a, value2a),
(value1b, value2b),
(value1c, value2c);
-- 示例
INSERT INTO employees (id, name, department, salary)
VALUES
(1, 'Alice', 'HR', 50000),
(2, 'Bob', 'IT', 60000),
(3, 'Charlie', 'Sales', 55000);
二、高级插入方法
1. INSERT INTO SELECT(从其他表复制数据)
-- 将一个表的数据插入到另一个表
INSERT INTO target_table (column1, column2)
SELECT source_column1, source_column2
FROM source_table
WHERE condition;
-- 示例:将老用户复制到新用户表
INSERT INTO new_users (id, username, email)
SELECT id, username, email
FROM old_users
WHERE active = 1;
2. 插入时使用子查询
-- 插入时动态获取值
INSERT INTO orders (order_id, customer_id, product_id, quantity)
VALUES
(1001,
(SELECT customer_id FROM customers WHERE email = 'john@example.com'),
5,
2);
三、特殊插入场景
1. 插入默认值
-- 使用 DEFAULT 关键字
INSERT INTO products (id, name, price, stock)
VALUES (1, 'Phone', 699.99, DEFAULT);
-- 使用默认值的简写
INSERT INTO products (name, price) VALUES ('Tablet', 299.99);
2. 插入当前时间
-- 使用数据库函数获取当前时间
INSERT INTO logs (event, created_at)
VALUES ('User login', NOW()); -- MySQL
INSERT INTO logs (event, created_at)
VALUES ('User login', GETDATE()); -- SQL Server
INSERT INTO logs (event, created_at)
VALUES ('User login', CURRENT_TIMESTAMP); -- 标准SQL
四、INSERT 扩展用法
1. INSERT IGNORE(MySQL)
-- 忽略重复键错误
INSERT IGNORE INTO users (id, username)
VALUES (1, 'john_doe');
2. ON DUPLICATE KEY UPDATE(MySQL)
-- 如果主键冲突则更新
INSERT INTO users (id, username, email, login_count)
VALUES (1, 'john_doe', 'john@example.com', 1)
ON DUPLICATE KEY UPDATE
email = VALUES(email),
login_count = login_count + 1;
3. UPSERT(PostgreSQL)
-- PostgreSQL 的 UPSERT 语法
INSERT INTO users (id, username, email)
VALUES (1, 'john_doe', 'john@example.com')
ON CONFLICT (id) DO UPDATE
SET username = EXCLUDED.username,
email = EXCLUDED.email;
4. MERGE(SQL Server)
-- SQL Server 的 MERGE 语句
MER INTO users AS target
USING (VALUES (1, 'john_doe', 'john@example.com'))
AS source (id, username, email)
ON target.id = source.id
WHEN MATCHED THEN
UPDATE SET username = source.username, email = source.email
WHEN NOT MATCHED THEN
INSERT (id, username, email) VALUES (source.id, source.username, source.email);
五、完整示例
-- 1. 创建示例表
CREATE TABLE students (
student_id INT PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
age INT,
grade VARCHAR(10),
enrollment_date DATE DEFAULT CURRENT_DATE
);
-- 2. 插入单条数据
INSERT INTO students (student_id, first_name, last_name, age, grade)
VALUES (1001, 'John', 'Smith', 18, 'A');
-- 3. 插入多条数据
INSERT INTO students (student_id, first_name, last_name, age, grade)
VALUES
(1002, 'Sarah', 'Johnson', 19, 'B+'),
(1003, 'Mike', 'Brown', 17, 'A-'),
(1004, 'Emma', 'Davis', 18, 'B');
-- 4. 从其他表插入数据
CREATE TABLE honors_students (
student_id INT PRIMARY KEY,
full_name VARCHAR(100),
grade VARCHAR(10)
);
INSERT INTO honors_students (student_id, full_name, grade)
SELECT student_id, CONCAT(first_name, ' ', last_name), grade
FROM students
WHERE grade LIKE 'A%';
-- 5. 使用事务插入数据
BEGIN TRANSACTION;
INSERT INTO students (student_id, first_name, last_name)
VALUES (1005, 'Tom', 'Wilson');
-- 可以执行其他操作
INSERT INTO enrollments (student_id, course_id) VALUES (1005, 'MATH101');
-- 提交或回滚
COMMIT; -- 或 ROLLBACK;
六、最佳实践
始终指定列名:提高代码可读性和维护性
使用批量插入:当需要插入大量数据时
验证数据完整性:插入前检查外键约束
使用事务:确保数据的原子性
处理异常:考虑使用
TRY...CATCH(SQL Server)或异常处理
这些方法涵盖了 SQL 中添加数据的主要场景,实际使用时请根据具体的数据库系统选择合适的方法。