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

PHP MySQL 建立資料表完整指南:CREATE TABLE 語法、欄位屬性、索引與三大介面實作

     編輯:PHP 入門

PHP MySQL 建立資料表深度解析:DDL 語法、欄位型別、約束條件、索引策略與實戰代碼

資料表結構設計是資料庫應用的基石。本文詳細說明 CREATE TABLE 完整語法、欄位資料型別、約束條件、索引類型、儲存引擎選擇,並提供 MySQLi (OO/程序式) 與 PDO 完整建表實作代碼。

CREATE TABLE 完整語法

CREATE TABLE [IF NOT EXISTS] table_name (
    column_name data_type [column_attributes] [column_constraints],
    ...,
    [table_constraints]
) [table_options];

核心欄位屬性與約束

常用資料型別選擇指南

屬性/約束語法說明
NOT NULLcolumn_name type NOT NULL禁止 NULL 值
DEFAULTcolumn_name type DEFAULT value預設值 (常數、函數 CURRENT_TIMESTAMP)
AUTO_INCREMENTid INT UNSIGNED AUTO_INCREMENT整數自動遞增,通常搭配 PRIMARY KEY
PRIMARY KEYPRIMARY KEY (col1, col2) 或欄位級 PRIMARY KEY唯一識別每列,隱含 NOT NULL
UNIQUEUNIQUE (email) 或欄位級 UNIQUE值唯一,允許多個 NULL
FOREIGN KEYFOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE參考完整性,需 InnoDB
CHECKCHECK (age >= 18) (MySQL 8.0.16+)值域驗證
COMMENTCOMMENT '用戶電子郵件'欄位說明
UNSIGNEDINT UNSIGNED無號整數,範圍 0 ~ 2倍上限
ZEROFILLINT(5) ZEROFILL前導零填充 (隱含 UNSIGNED)

索引類型與策略

類別型別儲存/範圍適用場景
整數TINYINT1 byte, -128~127 / 0~255旗標、小範圍計數
SMALLINT2 bytes, -32K~32K / 0~65K較大計數
MEDIUMINT3 bytes, -8M~8M / 0~16M中等計數
INT / INTEGER4 bytes, -2B~2B / 0~4B標準 ID、計數器
BIGINT8 bytes, -9E18~9E18大量 ID、時間戳毫秒
定點/浮點DECIMAL(p,s)精確定點,p 總位數,s 小數位金額、價格、比率 (必用)
FLOAT4 bytes, 約 7 位有效數字科學計算、近似值
DOUBLE8 bytes, 約 15 位有效數字高精度近似值
字串VARCHAR(n)變長,1-65535 bytes + 1-2 bytes 長度一般文字、名稱、代碼
CHAR(n)固定長度,0-255 bytes固定長代碼 (MD5、UUID、國家代碼)
TEXT65KB,長文本文章、描述、JSON 文本
LONGTEXT4GB,超長文本大型文檔
日期時間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)自動時間戳、跨時區 (有時區轉換)
YEAR1 byte, 1901~2155年份
二進位BLOB65KB小型二進位
LONGBLOB4GB大型檔案、圖片
JSON類 LONGTEXT,驗證有效 JSON半結構化資料、屬性包 (MySQL 5.7+)

表選項

CREATE TABLE MyGuests (...) 
ENGINE=InnoDB 
DEFAULT CHARSET=utf8mb4 
COLLATE=utf8mb4_unicode_ci 
ROW_FORMAT=DYNAMIC 
COMMENT='用戶資訊表';
  • ENGINE:InnoDB (預設、支援交易/外鍵/行鎖) / MyISAM (舊版、全文索引、表鎖) / MEMORY (記憶體表)
  • CHARSET:utf8mb4 (支援完整 Unicode 含 Emoji),勿用 utf8 (僅 BMP)
  • COLLATE:utf8mb4_unicode_ci (標準 Unicode 排序) / utf8mb4_general_ci (較快但排序較粗略)
  • ROW_FORMAT:DYNAMIC (InnoDB 預設、支援壓縮、長字串溢位頁)

完整建表示例:用戶資訊表

$sql = <<

MySQLi 物件導向建表

$mysqli = new mysqli('localhost', 'user', 'pass', 'db');
if ($mysqli->connect_error) die("連線失敗: " . $mysqli->connect_error);

if ($mysqli->query($sql) === true) {
    echo "資料表建立成功";
} else {
    echo "建立失敗: " . $mysqli->error;
}
$mysqli->close();

MySQLi 程序式建表

$conn = mysqli_connect('localhost', 'user', 'pass', 'db');
if (!$conn) die("連線失敗: " . mysqli_connect_error());

if (mysqli_query($conn, $sql)) {
    echo "資料表建立成功";
} else {
    echo "建立失敗: " . mysqli_error($conn);
}
mysqli_close($conn);

PDO 建表

$pdo = new PDO("mysql:host=localhost;dbname=db", 'user', 'pass');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try {
    $pdo->exec($sql); // exec() 用於無結果集 DDL/DML
    echo "資料表建立成功";
} catch (PDOException $e) {
    echo "建立失敗: " . $e->getMessage();
}
$pdo = null;

檢查表是否存在、結構資訊

// 1. SHOW TABLES LIKE 'users'
$exists = $pdo->query("SHOW TABLES LIKE 'users'")->rowCount() > 0;

// 2. DESCRIBE / SHOW COLUMNS
$cols = $pdo->query("DESCRIBE `users`")->fetchAll(PDO::FETCH_ASSOC);

// 3. SHOW CREATE TABLE
$createSql = $pdo->query("SHOW CREATE TABLE `users`")->fetchColumn();

// 4. INFORMATION_SCHEMA (跨資料庫、程式化)
$tables = $pdo->query("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'db'")->fetchAll(PDO::FETCH_COLUMN);

常見設計錯誤與優化建議

索引類型建立語法特性適用場景
PRIMARY KEY欄位級或表級叢集索引、唯一、非空、單表僅一個主鍵 ID
UNIQUE INDEXUNIQUE INDEX idx_email (email)唯一、允許 NULL、非叢集Email、用戶名、身分證號
INDEX / KEYINDEX idx_name (lastname, firstname)非唯一、非叢集、支援前綴常用 WHERE/JOIN/ORDER BY 欄位
FULLTEXTFULLTEXT INDEX idx_content (content)全文搜尋,MyISAM/InnoDB 5.6+文章搜尋、日誌分析
SPATIALSPATIAL INDEX idx_location (geo_point)地理空間,InnoDB 5.7+GIS 應用
複合索引INDEX idx_a_b (a, b)最左前綴原則,順序關鍵多欄位組合查詢

總結

建立資料表是資料庫應用的基礎工程。掌握 資料型別精準選擇、約束條件完整定義、索引策略科學規劃、字元集統一 utf8mb4、引擎選擇 InnoDB,並透過 PDO 統一介面執行 DDL,能奠定高效能、可擴展、資料一致性的堅實基礎。代碼中建議使用 Heredoc 多行字串維護 SQL 可讀性,並納入版本控管遷移腳本 (Migration) 管理結構演進。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
錯誤影響修正
使用 INT(11) 顯示寬度無實際效果,誤導開發者僅用 INT,應用層控制顯示
金額用 FLOAT/DOUBLE精度誤差導致金額錯誤必用 DECIMAL(10,2) 或 DECIMAL(19,4)
VARCHAR(255) 通用浪費空間、索引效能差依業務實際長度設定 (如 email 100、手機 20)
缺少 NOT NULLNULL 語意模糊、索引效能差業務必填欄位加 NOT NULL
缺少 updated_at 自動更新手動維護易遺漏ON UPDATE CURRENT_TIMESTAMP
使用 utf8 而非 utf8mb4無法儲存 Emoji、部分生僻字全庫 utf8mb4
大量索引未評估寫入效能下降、空間浪費依實際查詢模式建立、定期審視