INSERT INTO 是資料入庫的大門。無論是後台管理新增文章、用戶註冊寫入帳號、IoT 設備上報遙測數據,核心動作都是 INSERT。本文系統講解完整語法、多種寫法變體、自增主鍵處理、時間函數應用,並以 PHP 表單提交為例展示防注入、轉義、驗證的完整實戰流程。
INSERT INTO table_name (col1, col2, col3) VALUES (val1, val2, val3);
INSERT INTO table_name VALUES (val1, val2, val3);
INSERT INTO table_name (col1, col2) VALUES (val1, val2), (val3, val4), (val5, val6);
INSERT INTO target_tbl (col1, col2) SELECT col_a, col_b FROM source_tbl WHERE condition;
-- 忽略重複鍵錯誤,靜默跳過 INSERT IGNORE INTO tbl (id, name) VALUES (1, 'A'); -- 衝突時更新指定欄位(Upsert) INSERT INTO tbl (id, name, count) VALUES (1, 'A', 1) ON DUPLICATE KEY UPDATE count = count + 1, name = VALUES(name);
mysql> INSERT INTO runoob_tbl
-> (runoob_title, runoob_author, submission_date)
-> VALUES
-> ("Learn PHP", "John Poul", NOW()),
-> ("Learn MySQL", "Abdul S", NOW()),
-> ("JAVA Tutorial", "Sanjay", '2007-05-06');
Query OK, 3 rows affected (0.01 sec)
關鍵點:
runoob_id 為 AUTO_INCREMENT,插入時省略或給 NULL,自動分配遞增 ID。NOW() 返回當前日期時間(YYYY-MM-DD HH:MM:SS),適用 DATETIME/TIMESTAMP 欄位。-> 只是命令列換行提示,非 SQL 一部分。<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['add'])) {
// 1. 連線
$conn = new mysqli('localhost:3306', 'root', 'rootpassword', 'RUNOOB');
if ($conn->connect_error) die('Connect failed: ' . $conn->connect_error);
// 2. 獲取並清洗輸入
$title = trim($_POST['runoob_title'] ?? '');
$author = trim($_POST['runoob_author'] ?? '');
$date = $_POST['submission_date'] ?? date('Y-m-d');
// 3. 基礎驗證
if ($title === '' || $author === '') {
die('Title and Author are required');
}
// 日期格式驗證
if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $date)) {
die('Invalid date format (YYYY-MM-DD)');
}
// 4. 預處理插入(防注入核心)
$sql = 'INSERT INTO runoob_tbl (runoob_title, runoob_author, submission_date) VALUES (?, ?, ?)';
$stmt = $conn->prepare($sql);
$stmt->bind_param('sss', $title, $author, $date);
$stmt->execute();
if ($stmt->affected_rows > 0) {
echo "Inserted successfully. New ID: " . $stmt->insert_id;
} else {
echo "Insert failed: " . $stmt->error;
}
$stmt->close();
$conn->close();
} else {
?>
<form method="post">
<label>Title: <input name="runoob_title" required></label><br>
<label>Author: <input name="runoob_author" required></label><br>
<label>Date (YYYY-MM-DD): <input name="submission_date" type="date"></label><br>
<button name="add" type="submit">Add</button>
</form>
<?php } ?>
mysqli/PDO 皆支援。required、type="date")+ 後端 PHP 邏輯驗證(長度、格式、業務規則)。BEGIN; INSERT ...; INSERT ...; COMMIT; 保證原子性。$stmt->insert_id(mysqli)或 $pdo->lastInsertId()(PDO)。Error 1364: Field 'col' doesn't have a default value:非 NULL 無預設值欄位未給值 → 補上欄位與值、或設定 DEFAULT。Error 1062: Duplicate entry:唯一鍵衝突 → 用 ON DUPLICATE KEY UPDATE 或先查重。Incorrect datetime value:日期格式不符 → 統一用 YYYY-MM-DD HH:MM:SS 或 NOW()。INSERT 看似簡單,實則承載著資料完整性、安全性、效能的多重考驗。掌握語法變體、善用批次與 Upsert、堅持預處理與驗證,讓每一筆資料都乾淨、準確、高效地落庫。