天津市护送信息网

SQL中如何添加数据(常见方法及示例)

2026-03-27 14:55:02 浏览次数:0
详细信息

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 中添加数据的主要场景,实际使用时请根据具体的数据库系统选择合适的方法。

相关推荐