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字符
- 定期维护表结构,避免频繁修改