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

MySQL CREATE TABLE 建表完全指南:欄位定義、約束條件、AUTO_INCREMENT 與 PHP 實戰

     編輯:MySQL 入門

MySQL CREATE TABLE 建表完全指南:欄位定義、約束條件、AUTO_INCREMENT 與 PHP 實戰

CREATE TABLE 是資料庫結構設計的起點。一張良好的表結構:欄位類型精準、約束完整、索引合理、命名規範,能為後續開發、查詢效能、資料品質奠定堅實基礎。本文系統講解語法要素、核心約束、命令列與 PHP 實戰,並分享建表最佳實踐。

核心語法

CREATE TABLE [IF NOT EXISTS] table_name (
    column_name column_type [column_attributes] [column_constraints],
    ...,
    [table_constraints]
) [table_options];
  • IF NOT EXISTS:表已存在時不報錯,部署腳本必加。
  • column_attributes:NOT NULL、DEFAULT、AUTO_INCREMENT、COMMENT 等。
  • column_constraints:PRIMARY KEY、UNIQUE、CHECK(8.0.16+ 生效)。
  • table_constraints:複合主鍵、外鍵、複合唯一、CHECK 等。
  • table_options:ENGINE=InnoDB、CHARSET=utf8mb4、COLLATE=utf8mb4_general_ci、PARTITION BY... 等。

實戰範例:runoob_tbl 教程表

CREATE TABLE runoob_tbl (
    runoob_id INT NOT NULL AUTO_INCREMENT,
    runoob_title VARCHAR(100) NOT NULL,
    runoob_author VARCHAR(40) NOT NULL,
    submission_date DATE,
    PRIMARY KEY (runoob_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

欄位解析

欄位 類型與屬性 含義
runoob_idINT NOT NULL AUTO_INCREMENT主鍵,自動遞增,不可為空
runoob_titleVARCHAR(100) NOT NULL標題,最長 100 字符,必填
runoob_authorVARCHAR(40) NOT NULL作者,最長 40 字符,必填
submission_dateDATE發布日期,可為 NULL

核心約束深度解析

NOT NULL — 拒絕空值

插入/更新時若給 NULL 直接報錯 Error 1364。業務必填欄位務必加 NOT NULL,資料庫層面攔截,比應用層驗證更可靠。

AUTO_INCREMENT — 自增主鍵

  • 僅限整數類型(TINYINT/SMALLINT/MEDIUMINT/INT/BIGINT)。
  • 一張表僅能有一個自增欄位,且必須為索引(通常是主鍵)。
  • 起始值預設 1,步長 1。可用 ALTER TABLE tbl AUTO_INCREMENT=1000; 調整起始值。
  • InnoDB 持久化自增計數器(8.0+),重啟不回退。

PRIMARY KEY — 主鍵約束

  • 隱含 NOT NULL + UNIQUE。
  • 單表僅一個主鍵,可為單欄或複合(多欄)。
  • InnoDB 主鍵即聚簇索引,資料按主鍵順序物理存放,主鍵查詢極快。
  • 建議:業務無關的單欄自增整數作為主鍵(代理鍵),避免業務鍵變更、複合鍵膨脹二級索引。

DEFAULT — 預設值

CREATE TABLE orders (
    status ENUM('pending','paid','shipped') NOT NULL DEFAULT 'pending',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

命令列建表實戰

mysql> USE RUNOOB;
mysql> CREATE TABLE runoob_tbl(
    -> runoob_id INT NOT NULL AUTO_INCREMENT,
    -> runoob_title VARCHAR(100) NOT NULL,
    -> runoob_author VARCHAR(40) NOT NULL,
    -> submission_date DATE,
    -> PRIMARY KEY (runoob_id)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Query OK, 0 rows affected (0.16 sec)

PHP 實戰:白名單驗證 + 異常處理

<?php
$table = 'runoob_tbl';
$allowed = ['runoob_tbl', 'tcount_tbl', 'employee_tbl'];
if (!in_array($table, $allowed)) die('Invalid table');

$sql = "CREATE TABLE IF NOT EXISTS `$table` (
    `runoob_id` INT NOT NULL AUTO_INCREMENT,
    `runoob_title` VARCHAR(100) NOT NULL,
    `runoob_author` VARCHAR(40) NOT NULL,
    `submission_date` DATE,
    PRIMARY KEY (`runoob_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";

$conn = new mysqli('localhost:3306', 'root', 'rootpassword', 'RUNOOB');
if ($conn->connect_error) die('Connect failed: ' . $conn->connect_error);

if ($conn->query($sql)) {
    echo "Table `$table` created successfully\n";
} else {
    echo "Create failed: " . $conn->error;
}
$conn->close();
?>

建表最佳實踐清單

  1. 統一命名規範: 表名、欄位名小寫下劃線 snake_case,無保留字、無特殊字符。
  2. 字符集統一 utf8mb4: 支援 Emoji、完整 Unicode,COLLATE utf8mb4_general_ci 或 0900_ai_ci(8.0+)。
  3. 引擎統一 InnoDB: 支援事務、行鎖、外鍵、崩潰恢復。
  4. 每欄加 COMMENT: 文檔化結構,SHOW FULL COLUMNS 可見。
  5. 時間戳欄位用 TIMESTAMP + DEFAULT CURRENT_TIMESTAMP:自動維護創建/更新時間。
  6. 金額用 DECIMAL(19,4):避免浮點誤差。
  7. 軟刪除欄位: deleted_at DATETIME NULL DEFAULT NULL 或 is_deleted TINYINT DEFAULT 0。
  8. 版本/樂觀鎖欄位: version INT DEFAULT 0 防止並發覆蓋。
  9. 大文本分表: TEXT/BLOB 超過 64KB 考慮拆分附屬表,主表保持輕量。
  10. 變更走遷移工具: Flyway、Liquibase、或框架內建 Migration,版本控管、可回滾、可審計。

常見建表錯誤

  • Error 1075: Incorrect table definition:自增欄位非索引 → 加 PRIMARY KEY 或 UNIQUE KEY。
  • Error 1170: BLOB/TEXT column can't have a default value:TEXT/BLOB 不支援 DEFAULT → 移除或改用 VARCHAR。
  • Error 1067: Invalid default value:日期預設值格式錯誤 → 用 CURRENT_TIMESTAMP 或合法字面值。

CREATE TABLE 不是一次性動作,而是隨業務演進持續優化的過程。遵循「約束優於驗證、規範優於自由、遷移優於手改」原則,打造經得起時間考驗的資料骨架。

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