INSERT INTO table_name VALUES (value1, value2, ...);
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);
INSERT INTO `news` (title, body, time)
VALUES
('title 1', 'body 1', NOW()),
('title 2', 'body 2', NOW()),
('title 3', 'body 3', NOW());
優勢:單次網路往返、單次解析優化、事務原子性,大幅優於循環單筆插入。
INSERT INTO news_one (id, title, body, time) SELECT id, title, body, time FROM news_two;
注意:兩表結構需相容(欄位數、型別、順序),欄位名稱可不同。
<?php
$mysqli = new mysqli("localhost", "user", "password", "my_db");
if ($mysqli->connect_errno) {
die("連線失敗: " . $mysqli->connect_error);
}
// 預處理語句(防 SQL 注入、效能更好)
$stmt = $mysqli->prepare("INSERT INTO Persons (FirstName, LastName, Age) VALUES (?, ?, ?)");
$stmt->bind_param("ssi", $firstName, $lastName, $age);
// 批次插入範例
$data = [
['John', 'Doe', 30],
['Jane', 'Smith', 25],
['Bob', 'Johnson', 35]
];
$mysqli->begin_transaction();
try {
foreach ($data as $row) {
[$firstName, $lastName, $age] = $row;
$stmt->execute();
}
$mysqli->commit();
echo count($data) . " 筆資料新增成功";
} catch (Exception $e) {
$mysqli->rollback();
echo "新增失敗: " . $e->getMessage();
}
$stmt->close();
$mysqli->close();
?>
| 問題 | 原因 | 解決方法 |
|---|---|---|
| 中文亂碼 | 連線/資料庫編碼不一致 | 執行 SET NAMES utf8mb4、確保資料庫 CHARSET=utf8mb4 |
| 主鍵衝突 | AUTO_INCREMENT 重複或手動指定 ID | 檢查主鍵策略、使用 INSERT IGNORE 或 ON DUPLICATE KEY UPDATE |
| 大量插入超時 | 單次事務過大、鎖等待 | 分批提交(每 500-1000 筆)、調整 max_allowed_packet |
| 特殊字元截斷 | 未轉義單引號等字元 | 務必使用預處理或 mysqli_real_escape_string() |
LOAD DATA INFILE 處理超大量 CSV/TSV 匯入bulk_insert_buffer_size(MyISAM)或 innodb_log_buffer_size(InnoDB)