首页 / PHP 入门教程 / MySQL 创建数据库和表

PHP 入门教程

MySQL 创建数据库和表

本教程共 65 篇 · 第 50 篇 · 更新于 2026-07-24 · 约 8 分钟阅读

PHPPHP8MySQLCREATE TABLE字段约束外键InnoDB

50. MySQL 创建数据库和表

本节目标:掌握 CREATE DATABASECREATE 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

TRUNCATEDELETE 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() 适用于不返回结果集的语句,如 CREATEINSERTUPDATEDELETE


小结

设计表结构时,先确定字段和数据类型,再考虑是否需要索引和外键。InnoDB + utf8mb4 是现代 PHP 项目的标准配置。


来源:参考了 runoob「PHP MySQL 创建数据库」、PHP 官方文档,改写后所得。