在 MySQL 中,INSERT 语句可以与子查询(subquery)结合使用,这种方式允许您从一个表查询数据并将其插入到另一个表中。这种技术通常被称为"INSERT...SELECT"语句。
INSERT INTO target_table (column1, column2, ...)
SELECT column1, column2, ...
FROM source_table
WHERE condition;
错误现象:Column count doesn't match value count
原因:INSERT 语句中指定的列数与 SELECT 语句返回的列数不一致
解决方案:
-- 确保列数匹配
INSERT INTO table1 (col1, col2)
SELECT colA, colB FROM table2;
错误现象:Incorrect integer value
或类似类型错误
原因:尝试将不兼容的数据类型插入到目标列
解决方案:
-- 使用CAST或CONVERT函数转换数据类型
INSERT INTO table1 (int_col, date_col)
SELECT CAST(string_col AS SIGNED), STR_TO_DATE(date_string, '%Y-%m-%d')
FROM table2;
错误现象:Duplicate entry for key
原因:尝试插入与现有行具有相同唯一键或主键的值
解决方案:
-- 使用INSERT IGNORE跳过冲突行
INSERT IGNORE INTO table1 (id, name)
SELECT id, name FROM table2;
-- 或使用ON DUPLICATE KEY UPDATE更新现有行
INSERT INTO table1 (id, name)
SELECT id, name FROM table2
ON DUPLICATE KEY UPDATE name = VALUES(name);
错误现象:插入大量数据时执行缓慢
原因:未优化的大批量插入操作
解决方案:
-- 分批插入
INSERT INTO large_table (col1, col2)
SELECT col1, col2 FROM source_table
LIMIT 10000 OFFSET 0;
-- 然后逐步增加OFFSET值
INSERT INTO customer_orders (customer_id, order_count, total_amount)
SELECT c.id, COUNT(o.id), SUM(o.amount)
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
GROUP BY c.id;
INSERT INTO product_stats (product_id, avg_price, max_price)
SELECT
product_id,
(SELECT AVG(price) FROM prices WHERE product_id = p.product_id),
(SELECT MAX(price) FROM prices WHERE product_id = p.product_id)
FROM products p;
INSERT INTO premium_users (user_id, join_date)
SELECT id, created_at
FROM users
WHERE (SELECT SUM(amount) FROM payments WHERE user_id = users.id) > 1000;
没有搜到相关的文章