PHP 入门教程
MySQL 创建数据库和表
本教程共 65 篇 · 第 50 篇 · 更新于 2026-07-24 · 约 8 分钟阅读
PHPPHP8MySQLCREATE TABLE字段约束外键InnoDB
50. MySQL 创建数据库和表
本节目标:掌握
CREATE DATABASE和CREATE TABLE语句,能够设计合理的表结构并添加约束。
上一节了解了 MySQL 的基础概念。本节动手实践,创建第一个数据库和数据表。
1. 创建数据库
CREATE DATABASE my_shop;
更完整的写法,指定字符集:
CREATE DATABASE IF NOT EXISTS my_shop
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
IF NOT EXISTS:数据库已存在时不报错utf8mb4:完整支持中文、emoji 等 Unicode 字符utf8mb4_unicode_ci:通用排序规则,区分大小写合理
创建后切换到该数据库:
USE my_shop;
2. 创建数据表
以商品表 products 为例:
CREATE TABLE IF NOT EXISTS products (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
name VARCHAR(100) NOT NULL COMMENT '商品名称',
price DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '单价',
stock INT NOT NULL DEFAULT 0 COMMENT '库存',
category_id INT DEFAULT NULL COMMENT '分类ID',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Tip养成写
COMMENT的习惯,方便团队成员理解字段含义。
3. 字段约束详解
约束用于保证数据的完整性和一致性。
| 约束 | 写法 | 作用 |
|---|---|---|
| 主键 | PRIMARY KEY | 唯一标识每行记录 |
| 自增 | AUTO_INCREMENT | 自动递增,通常配合主键 |
| 非空 | NOT NULL | 字段必须有值 |
| 唯一 | UNIQUE | 值不能重复 |
| 默认值 | DEFAULT | 不填时自动填充 |
| 外键 | FOREIGN KEY | 关联其他表的主键 |
唯一约束示例
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
phone VARCHAR(20) UNIQUE
);
外键约束示例
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
total_price DECIMAL(10,2) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
Note
ON DELETE CASCADE表示删除用户时,自动删除关联的订单。RESTRICT则禁止删除有外键关联的数据。
4. 修改和删除表
修改表结构
-- 添加字段
ALTER TABLE products ADD COLUMN description TEXT AFTER name;
-- 修改字段类型
ALTER TABLE products MODIFY COLUMN stock INT UNSIGNED NOT NULL DEFAULT 0;
-- 删除字段
ALTER TABLE products DROP COLUMN description;
-- 添加索引
ALTER TABLE products ADD INDEX idx_category (category_id);
删除表
-- 删除表(数据全部丢失,谨慎操作)
DROP TABLE IF EXISTS products;
-- 清空表数据,但保留表结构
TRUNCATE TABLE products;
Tip
TRUNCATE比DELETE FROM更快,因为它不记录单行删除日志,且会重置自增 ID。
5. 用 PHP 创建表
<?php
$pdo = new PDO('mysql:host=localhost;dbname=my_shop;charset=utf8mb4', 'root', '123456');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "CREATE TABLE IF NOT EXISTS categories (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL UNIQUE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
$pdo->exec($sql);
echo '表创建成功';
Note
exec()适用于不返回结果集的语句,如CREATE、INSERT、UPDATE、DELETE。
小结
设计表结构时,先确定字段和数据类型,再考虑是否需要索引和外键。InnoDB + utf8mb4 是现代 PHP 项目的标准配置。
来源:参考了 runoob「PHP MySQL 创建数据库」、PHP 官方文档,改写后所得。