INSERT语句的新写法

本文介绍了一种在SQL中批量插入数据的方法,通过一次执行多条记录的INSERT语句,提高数据库操作效率。此方法适用于需要大量数据录入的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 今天一个偶然的机会中知道 SQL 中的 INSERT 语句还可以这样写:

[pre]INSERT INTO tbl_name (col1, col2) VALUES (value1_1, value1_2),(value2_1, value2_2),(value3_1, value3_2)...[/pre]
这样的写法实际上类似于:

[pre]INSERT INTO tbl_name (col1, col2) VALUES (value1_1, value1_2)INSERT INTO tbl_name (col1, col2) VALUES (value2_1, value2_2)INSERT INTO tbl_name (col1, col2) VALUES (value3_1, value3_2)...[/pre]
如果在执行过程中碰到一个值错误,则这个值以后的数据都不会被插入。
### 使用 MySQL 的 `INSERT INTO SELECT` 语句 #### 基本语法 `INSERT INTO SELECT` 是一种强大的 SQL 语句,允许从一个表中选择数据并将这些数据插入到另一个表中。其基本语法如下: ```sql INSERT INTO target_table (column1, column2, ...) SELECT source_column1, source_column2, ... FROM source_table WHERE condition; ``` 此语法中的各部分含义分别为: - **target_table**: 数据要被插入的目标表。 - **source_table**: 提供数据的源表。 - **columns**: 列名列表,目标表和源表之间的列数以及兼容性需匹配。 - **condition**: 可选条件子句,用于过滤所选数据。 #### 示例说明 假设存在两个表:`employees` 和 `new_employees`。现在希望将某些符合条件的员工记录从 `employees` 表复制到 `new_employees` 表中。 以下是具体的实现方法[^1]: ```sql -- 将 employees 中 salary 大于 5000 的记录插入 new_employees INSERT INTO new_employees (id, name, position, salary) SELECT id, name, position, salary FROM employees WHERE salary > 5000; ``` 在此示例中: - `new_employees` 是目标表。 - `employees` 是源表。 - 条件 `salary > 5000` 被用来筛选哪些记录会被复制。 如果需要复制整个表的内容而不加任何条件,则可以省略 `WHERE` 子句: ```sql -- 不带条件的完整复制 INSERT INTO new_employees (id, name, position, salary) SELECT id, name, position, salary FROM employees; ``` #### 注意事项 1. **列的数量与顺序**:目标表和源表之间涉及的列数量应一致,并且它们的数据类型应当兼容。 2. **唯一键冲突**:如果目标表有主键或唯一索引约束,在执行该操作前务必确认不会违反这些约束[^3]。 3. **性能优化**:对于大规模数据迁移场景下,建议先禁用外键检查 (`SET FOREIGN_KEY_CHECKS = 0`) 或者批量提交事务来提升效率。 #### 实际应用案例 下面是一个更复杂的例子,展示如何跨数据库进行数据转移[^2]: ```sql -- 把 db1.products 表里的商品价格大于等于 100 的产品信息同步至 db2.inventory USE db2; INSERT INTO inventory (product_id, product_name, price, stock_quantity) SELECT p.product_id, p.product_name, p.price, IFNULL(s.stock_count, 0) AS stock_quantity FROM db1.products p LEFT JOIN db1.stocks s ON p.product_id = s.product_id WHERE p.price >= 100; ``` 在这个复杂查询里: - 我们通过连接多个表获取所需的信息。 - 如果某个产品的库存不存在,默认设置为零(`IFNULL(s.stock_count, 0)`). ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值