首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 入門

MySQL INSERT 插入數據完全指南:語法變體、自增主鍵、NOW() 函數與 PHP 表單實戰

     編輯:MySQL 入門

MySQL INSERT 插入數據完全指南:語法變體、自增主鍵、NOW() 函數與 PHP 表單實戰

INSERT INTO 是資料入庫的大門。無論是後台管理新增文章、用戶註冊寫入帳號、IoT 設備上報遙測數據,核心動作都是 INSERT。本文系統講解完整語法、多種寫法變體、自增主鍵處理、時間函數應用,並以 PHP 表單提交為例展示防注入、轉義、驗證的完整實戰流程。

核心語法變體

標準完整寫法(推薦:明確欄位順序)

INSERT INTO table_name (col1, col2, col3)
VALUES (val1, val2, val3);

省略欄位列表(須按建表順序、全欄位給值)

INSERT INTO table_name VALUES (val1, val2, val3);

批次插入:單條 SQL 寫入多行(高效能)

INSERT INTO table_name (col1, col2) VALUES
(val1, val2), (val3, val4), (val5, val6);

INSERT ... SELECT:從查詢結果複製資料

INSERT INTO target_tbl (col1, col2)
SELECT col_a, col_b FROM source_tbl WHERE condition;

INSERT IGNORE / ON DUPLICATE KEY UPDATE:衝突處理

-- 忽略重複鍵錯誤,靜默跳過
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);

命令列實戰:runoob_tbl 表

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 表單實戰:完整防護流程

<?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 } ?>

安全與最佳實踐清單

  1. 預處理語句(Prepared Statements)是鐵律:徹底杜絕 SQL 注入,mysqli/PDO 皆支援。
  2. 輸入驗證雙層防護:前端 HTML5 驗證(required、type="date")+ 後端 PHP 邏輯驗證(長度、格式、業務規則)。
  3. 特殊字符無需手動 addslashes:預處理自動處理轉義,手動轉義反而易導致雙重轉義錯誤。
  4. 批次插入優於循環單條:萬筆以上資料,單條 SQL 批次插入比循環執行快 10-100 倍。
  5. 事務包裹批次操作:BEGIN; INSERT ...; INSERT ...; COMMIT; 保證原子性。
  6. 獲取自增 ID:$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、堅持預處理與驗證,讓每一筆資料都乾淨、準確、高效地落庫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved