PHP MySQL 创建数据表

在创建了MySQL数据库之后,下一步是在数据库中创建数据表。数据表是存储数据的结构化容器,定义了数据的组织方式。本教程将介绍如何使用PHP创建MySQL数据表,包括MySQLi扩展和PDO(PHP数据对象)两种方式。

前提条件

要创建MySQL数据表,您需要:

  • 已创建MySQL数据库
  • 具有创建数据表权限的MySQL用户账号
  • PHP环境中已启用MySQLi或PDO扩展

使用MySQLi创建数据表

MySQLi扩展提供了面向对象和过程式两种方式来创建数据表。

1. 面向对象方式

<?php
// 数据库连接参数
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);

// 检查连接
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

// SQL创建数据表语句
$sql = "CREATE TABLE MyGuests ("
. "id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,"
. "firstname VARCHAR(30) NOT NULL,"
. "lastname VARCHAR(30) NOT NULL,"
. "email VARCHAR(50),"
. "reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"
. ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";

if ($conn->query($sql) === true) {
    echo "数据表 MyGuests 创建成功";
} else {
    echo "创建数据表错误: " . $conn->error;
}

// 关闭连接
$conn->close();
?>

2. 过程式方式

<?php
// 数据库连接参数
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);

// 检查连接
if (!$conn) {
    die("连接失败: " . mysqli_connect_error());
}

// SQL创建数据表语句
$sql = "CREATE TABLE MyGuests ("
. "id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,"
. "firstname VARCHAR(30) NOT NULL,"
. "lastname VARCHAR(30) NOT NULL,"
. "email VARCHAR(50),"
. "reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"
. ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";

if (mysqli_query($conn, $sql)) {
    echo "数据表 MyGuests 创建成功";
} else {
    echo "创建数据表错误: " . mysqli_error($conn);
}

// 关闭连接
mysqli_close($conn);
?>

使用PDO创建数据表

PDO(PHP数据对象)也提供了创建数据表的功能。

<?php
// 数据库连接参数
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// 尝试连接数据库
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname;charset=utf8mb4", $username, $password);
    
    // 设置PDO错误模式为异常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    // SQL创建数据表语句
    $sql = "CREATE TABLE MyGuests ("
. "id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,"
. "firstname VARCHAR(30) NOT NULL,"
. "lastname VARCHAR(30) NOT NULL,"
. "email VARCHAR(50),"
. "reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"
. ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";
    
    // 使用exec(),因为不需要返回结果
    $conn->exec($sql);
    echo "数据表 MyGuests 创建成功";
} catch(PDOException $e) {
    echo "创建数据表错误: " . $e->getMessage();
}

// 关闭连接
$conn = null;
?>

MySQL数据类型

创建数据表时,需要为每个字段指定适当的数据类型。以下是一些常用的MySQL数据类型:

数据类型 描述 示例
INT(size) 整型数据,size表示显示宽度 INT(11)
VARCHAR(size) 可变长度的字符串,size最大为65535 VARCHAR(255)
TEXT 长文本数据,最大65535字节 TEXT
LONGTEXT 极大文本数据,最大4,294,967,295字节 LONGTEXT
DATE 日期值,格式为YYYY-MM-DD DATE
DATETIME 日期和时间值,格式为YYYY-MM-DD HH:MM:SS DATETIME
TIMESTAMP 时间戳,格式为YYYY-MM-DD HH:MM:SS TIMESTAMP
FLOAT(size,d) 浮点数,size表示总位数,d表示小数位数 FLOAT(10,2)
DOUBLE(size,d) 双精度浮点数 DOUBLE(10,2)
DECIMAL(size,d) 定点数,适合存储货币等精确数值 DECIMAL(10,2)
BOOLEAN 或 BOOL 布尔值,存储0或1 BOOLEAN
ENUM(value1,value2,...) 枚举类型,只能存储预定义的值之一 ENUM('active','inactive','pending')

表引擎选择

MySQL支持多种表存储引擎,最常用的是InnoDB和MyISAM。

引擎 特性 适用场景
InnoDB 支持事务、外键约束、行级锁 需要事务支持、多用户并发的应用
MyISAM 不支持事务,表级锁,查询性能高 读多写少、对事务要求不高的应用
MEMORY 内存存储,速度快,数据不持久 临时表、缓存

检查数据表是否存在

在创建数据表之前,可以先检查该表是否已经存在:

MySQLi方式

<?php
// 检查数据表是否存在
$tableName = "MyGuests";
$sql = "SHOW TABLES LIKE '$tableName;
$result = $conn->query($sql);

if ($result->num_rows == 0) {
    // 表不存在,创建表
    $sql = "CREATE TABLE $tableName ("
. "id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,"
. "firstname VARCHAR(30) NOT NULL,"
. "lastname VARCHAR(30) NOT NULL,"
. "email VARCHAR(50),"
. "reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"
. ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";
    
    if ($conn->query($sql) === true) {
        echo "数据表创建成功";
    } else {
        echo "创建数据表错误: " . $conn->error;
    }
} else {
    echo "数据表已经存在";
}
?>

PDO方式

<?php
// 检查数据表是否存在
$tableName = "MyGuests";
$sql = "SHOW TABLES LIKE '$tableName;
$stmt = $conn->query($sql);

if ($stmt->rowCount() == 0) {
    // 表不存在,创建表
    $sql = "CREATE TABLE $tableName ("
. "id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,"
. "firstname VARCHAR(30) NOT NULL,"
. "lastname VARCHAR(30) NOT NULL,"
. "email VARCHAR(50),"
. "reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"
. ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";
    
    $conn->exec($sql);
    echo "数据表创建成功";
} else {
    echo "数据表已经存在";
}
?>

高级表结构示例

下面是一个包含更多约束和关系的表结构示例:

<?php
// 创建产品表
$sql = "CREATE TABLE products ("
. "product_id INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,"
. "product_name VARCHAR(255) NOT NULL,"
. "description TEXT,"
. "price DECIMAL(10,2) NOT NULL DEFAULT '0.00',"
. "stock INT(11) NOT NULL DEFAULT '0',"
. "category_id INT(11) UNSIGNED,"
. "created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,"
. "updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,"
. "status ENUM('active','inactive','draft') DEFAULT 'active',"
. "CONSTRAINT fk_category FOREIGN KEY (category_id) REFERENCES categories(category_id) ON DELETE SET NULL ON UPDATE CASCADE"
. ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";

// 创建分类表
$sqlCategories = "CREATE TABLE categories ("
. "category_id INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,"
. "category_name VARCHAR(100) NOT NULL,"
. "parent_id INT(11) UNSIGNED DEFAULT NULL,"
. "CONSTRAINT fk_parent_category FOREIGN KEY (parent_id) REFERENCES categories(category_id) ON DELETE CASCADE ON UPDATE CASCADE"
. ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";
?>

常见约束

创建数据表时,可以为字段添加各种约束:

约束 描述 示例
NOT NULL 字段不能为NULL name VARCHAR(100) NOT NULL
UNIQUE 字段值必须唯一 email VARCHAR(100) UNIQUE
PRIMARY KEY 主键,唯一标识记录 id INT AUTO_INCREMENT PRIMARY KEY
FOREIGN KEY 外键,建立与另一个表的关系 category_id INT REFERENCES categories(id)
DEFAULT 设置默认值 status VARCHAR(20) DEFAULT 'active'
CHECK 检查字段值是否满足条件 age INT CHECK (age > 0)

表名和字段名命名规则

  • 使用小写字母和下划线组合
  • 避免使用MySQL保留字
  • 表名通常使用复数形式(如users, products)
  • 字段名应具有描述性(如user_name, product_price)
  • 保持一致性(如统一使用_id作为主键后缀)

最佳实践

  • 为每个表设计合适的主键
  • 选择适当的数据类型,避免使用过大的数据类型
  • 为必填字段添加NOT NULL约束
  • 为需要唯一的字段添加UNIQUE约束
  • 使用外键建立表之间的关系
  • 设置合理的默认值
  • 为表和字段添加注释(使用COMMENT关键字)
  • 选择合适的存储引擎,推荐使用InnoDB
  • 指定字符集为utf8mb4以支持所有Unicode字符
  • 定期维护表结构,避免频繁修改