首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL CREATE TABLE 建表實戰:欄位屬性、約束、索引、引擎選型、字元集與分區表完整語法指南

     編輯:MySQL 資料庫相關知識

CREATE TABLE 完整語法骨架


CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(
  create_definition,
  ...
)
[table_options]
[partition_options]
[select_statement]

欄位定義 create_definition 詳解


col_name data_type
  [NOT NULL | NULL]
  [DEFAULT default_value]
  [AUTO_INCREMENT]
  [UNIQUE [KEY] | [PRIMARY] KEY]
  [COMMENT 'string']
  [COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}]
  [STORAGE {DISK|MEMORY|DEFAULT}]
  [reference_definition]  -- 外鍵

常用資料類型選型指南

類別類型儲存/範圍適用場景
整數TINYINT1 byte, -128~127 / 0~255布林、狀態碼、極小計數
SMALLINT2 bytes, -32768~32767小範圍計數、年齡
INT / MEDIUMINT4/3 bytes, ~21億 / ~800萬通用 ID、外鍵、計數器
BIGINT8 bytes, ~9×10¹⁸大流水號、分散式 ID、時間戳毫秒
定點/浮點DECIMAL(p,s)p+2 bytes, 精確十進制金額、價格、比率 (絕不使用 FLOAT/DOUBLE)
FLOAT4 bytes, ~7 位有效數字科學計算、非精確測量
DOUBLE8 bytes, ~15 位有效數字高精度科學計算
字串CHAR(n)n bytes, 定長補空格固定長度代碼 (MD5、UUID、ISO 代碼)
VARCHAR(n)L+1/2 bytes, 變長通用字串、名稱、描述
TEXT / MEDIUMTEXT / LONGTEXT64KB/16MB/4GB長文本、JSON 文檔、日誌
BLOB 系列同 TEXT 二進位圖片、檔案、序列化物件
日期時間DATE3 bytes, 1000-01-01 ~ 9999-12-31生日、截止日、無時間需求
TIME3 bytes, -838:59:59 ~ 838:59:59時間段、工時
DATETIME8 bytes, 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59通用時間戳、業務時間
TIMESTAMP4 bytes, 1970-01-01 ~ 2038-01-19 (UTC)自動更新欄位、跨時區應用 (注意 2038 年問題)
JSONLONGTEXT 內部結構化文檔、動態屬性、8.0+ 原生索引延伸屬性、配置、日誌

約束與索引定義


-- 主鍵 (單欄)
id INT AUTO_INCREMENT PRIMARY KEY

-- 主鍵 (複合)
PRIMARY KEY (order_id, item_id)

-- 唯一索引
UNIQUE KEY uk_email (email)
UNIQUE KEY uk_order_user (order_id, user_id)

-- 普通索引
INDEX idx_status_created (status, created_at)
INDEX idx_user (user_id)

-- 外鍵 (僅 InnoDB)
CONSTRAINT fk_order_user FOREIGN KEY (user_id) REFERENCES users(id)
  ON DELETE RESTRICT ON UPDATE CASCADE

-- 檢查約束 (8.0.16+)
CONSTRAINT chk_amount_positive CHECK (amount > 0)

表選項 table_options 關鍵參數

選項範例說明
ENGINEENGINE=InnoDB儲存引擎,生產首選 InnoDB
CHARSET / COLLATEDEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci預設字元集/排序規則,支援 Emoji
AUTO_INCREMENTAUTO_INCREMENT=10000自增起始值
COMMENTCOMMENT='訂單主表'表註釋,顯示於 SHOW TABLE STATUS
ROW_FORMATROW_FORMAT=DYNAMICInnoDB 行格式,DYNAMIC/COMPRESSED 支援大欄位溢出頁
DATA DIRECTORY / INDEX DIRECTORYDATA DIRECTORY='/mnt/ssd/mysql'MyISAM 指定資料/索引目錄 (InnoDB 用符號連結/表空間)

實戰範例:電商訂單表 (含分區)


CREATE TABLE orders (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  user_id INT UNSIGNED NOT NULL,
  order_no VARCHAR(32) NOT NULL,
  amount DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  status TINYINT NOT NULL DEFAULT 0 COMMENT '0=待付款 1=已付款 2=已發貨 3=完成 4=取消',
  payment_method TINYINT DEFAULT NULL,
  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id, created_at),  -- 分區鍵必須包含在 PK
  UNIQUE KEY uk_order_no (order_no),
  KEY idx_user_created (user_id, created_at),
  KEY idx_status_created (status, created_at),
  CONSTRAINT fk_order_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE RESTRICT
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
ROW_FORMAT=DYNAMIC
COMMENT='訂單主表'
PARTITION BY RANGE (YEAR(created_at))
SUBPARTITION BY HASH (user_id)
SUBPARTITIONS 8 (
  PARTITION p2023 VALUES LESS THAN (2024),
  PARTITION p2024 VALUES LESS THAN (2025),
  PARTITION pmax VALUES LESS THAN MAXVALUE
);

TEMPORARY 表與 SELECT 建表


-- 臨時表 (連線結束自動刪除,可見性僅限當前 Session)
CREATE TEMPORARY TABLE tmp_user_stats
SELECT user_id, COUNT(*) AS order_cnt, SUM(amount) AS total_amt
FROM orders
WHERE created_at >= '2024-01-01'
GROUP BY user_id;

-- 複製表結構 (不複製資料、索引、約束、AUTO_INCREMENT)
CREATE TABLE orders_archive LIKE orders;

-- 複製表結構 + 資料 (不複製索引/約束/AI)
CREATE TABLE orders_bak AS SELECT * FROM orders;

驗證建表結果


SHOW CREATE TABLE orders\G
SHOW INDEX FROM orders;
SHOW TABLE STATUS LIKE 'orders'\G
建表即設計索引、分區、約束、字元集。遵循「類型最小化、NOT NULL 默認、外鍵謹慎、分區鍵入 PK、utf8mb4 標準化」五大原則,減少後期 DDL 變更成本,提升查詢穩定性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved