Skip to content

表操作

表是数据库中存储数据的基本单位。本章将介绍MySQL表的创建、修改、删除等操作。

创建表

基本语法

sql
-- 创建表的基本语法
/*
CREATE TABLE [IF NOT EXISTS] 表名 (
    列名1 数据类型 [列约束],
    列名2 数据类型 [列约束],
    ...
    [表约束]
) [表选项];
*/

-- 创建简单的表
CREATE TABLE students (
    id INT,
    name VARCHAR(50),
    age INT,
    score DECIMAL(5, 2)
);

-- 创建带约束的表
CREATE TABLE employees (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE,
    department_id INT,
    salary DECIMAL(10, 2) DEFAULT 0,
    hire_date DATE,
    status ENUM('active', 'inactive') DEFAULT 'active'
);

-- 使用IF NOT EXISTS避免重复创建
CREATE TABLE IF NOT EXISTS products (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    price DECIMAL(10, 2),
    stock INT DEFAULT 0
);

列约束

sql
/*
 * MySQL列约束:
 * 
 * PRIMARY KEY    - 主键约束(唯一标识)
 * AUTO_INCREMENT - 自动递增
 * NOT NULL       - 非空约束
 * UNIQUE         - 唯一约束
 * DEFAULT        - 默认值
 * COMMENT        - 注释
 * FOREIGN KEY    - 外键约束
 */

-- 创建带各种约束的表
CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '订单ID',
    order_no VARCHAR(32) NOT NULL UNIQUE COMMENT '订单号',
    user_id INT NOT NULL COMMENT '用户ID',
    total_amount DECIMAL(10, 2) NOT NULL DEFAULT 0 COMMENT '总金额',
    status TINYINT DEFAULT 0 COMMENT '订单状态:0待支付 1已支付 2已发货 3已完成',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT '订单表';

-- 查看表结构
DESC orders;

-- 查看建表语句
SHOW CREATE TABLE orders;

表约束

sql
-- 主键约束
CREATE TABLE primary_key_example (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

-- 复合主键
CREATE TABLE order_items (
    order_id INT,
    product_id INT,
    quantity INT,
    PRIMARY KEY (order_id, product_id)  -- 复合主键
);

-- 外键约束
CREATE TABLE departments (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL
);

CREATE TABLE employees_fk (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    department_id INT,
    salary DECIMAL(10, 2),
    
    -- 外键约束
    CONSTRAINT fk_department 
    FOREIGN KEY (department_id) 
    REFERENCES departments(id)
    ON DELETE SET NULL      -- 删除部门时,员工部门ID设为NULL
    ON UPDATE CASCADE       -- 更新部门ID时,级联更新
);

/*
 * 外键约束选项:
 * ON DELETE/ON UPDATE:
 * - CASCADE:级联操作
 * - SET NULL:设为NULL
 * - RESTRICT:拒绝操作(默认)
 * - NO ACTION:无操作
 */

-- 唯一约束
CREATE TABLE unique_example (
    id INT PRIMARY KEY,
    email VARCHAR(100),
    phone VARCHAR(20),
    
    UNIQUE KEY uk_email (email),
    UNIQUE KEY uk_phone (phone)
);

-- 检查约束(MySQL 8.0+)
CREATE TABLE check_example (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    age INT,
    salary DECIMAL(10, 2),
    
    CONSTRAINT chk_age CHECK (age >= 18 AND age <= 65),
    CONSTRAINT chk_salary CHECK (salary >= 0)
);

表选项

sql
-- 创建表时指定表选项
CREATE TABLE table_options (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50)
) 
ENGINE = InnoDB                    -- 存储引擎
DEFAULT CHARSET = utf8mb4          -- 字符集
COLLATE = utf8mb4_unicode_ci       -- 校对规则
AUTO_INCREMENT = 1000              -- 自增起始值
COMMENT = '示例表';                 -- 表注释

-- 查看表的存储引擎
SHOW TABLE STATUS LIKE 'table_options';

-- 查看表注释
SELECT 
    TABLE_NAME,
    TABLE_COMMENT
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE();

查看表

sql
-- 查看当前数据库的所有表
SHOW TABLES;

-- 查看表结构
DESC students;
DESCRIBE students;

-- 查看详细表结构
SHOW COLUMNS FROM students;

-- 查看建表语句
SHOW CREATE TABLE students;

-- 查看表状态
SHOW TABLE STATUS LIKE 'students';

-- 查看表的索引
SHOW INDEX FROM students;

-- 查看表空间使用情况
SELECT 
    TABLE_NAME,
    ENGINE,
    TABLE_ROWS,
    DATA_LENGTH,
    INDEX_LENGTH,
    DATA_LENGTH + INDEX_LENGTH AS total_size
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE();

修改表

添加列

sql
-- 添加单列
ALTER TABLE students 
ADD COLUMN gender ENUM('男', '女') AFTER name;

-- 添加多列
ALTER TABLE students 
ADD COLUMN address VARCHAR(200),
ADD COLUMN phone VARCHAR(20);

-- 添加列到第一列
ALTER TABLE students 
ADD COLUMN student_no VARCHAR(20) FIRST;

-- 添加带约束的列
ALTER TABLE students 
ADD COLUMN email VARCHAR(100) UNIQUE;

修改列

sql
-- 修改列数据类型
ALTER TABLE students 
MODIFY COLUMN name VARCHAR(100) NOT NULL;

-- 修改列名和数据类型
ALTER TABLE students 
CHANGE COLUMN score total_score DECIMAL(6, 2);

-- 修改列默认值
ALTER TABLE students 
ALTER COLUMN age SET DEFAULT 18;

-- 删除列默认值
ALTER TABLE students 
ALTER COLUMN age DROP DEFAULT;

-- 修改列注释
ALTER TABLE students 
MODIFY COLUMN name VARCHAR(100) COMMENT '学生姓名';

删除列

sql
-- 删除列
ALTER TABLE students 
DROP COLUMN address;

-- 删除多列
ALTER TABLE students 
DROP COLUMN phone,
DROP COLUMN email;

修改表名

sql
-- 重命名表
ALTER TABLE students 
RENAME TO student_info;

-- 或使用RENAME TABLE
RENAME TABLE student_info TO students;

-- 重命名多个表
RENAME TABLE 
    old_table1 TO new_table1,
    old_table2 TO new_table2;

修改表选项

sql
-- 修改存储引擎
ALTER TABLE students ENGINE = InnoDB;

-- 修改字符集
ALTER TABLE students DEFAULT CHARSET = utf8mb4;

-- 修改表注释
ALTER TABLE students COMMENT = '学生信息表';

-- 修改自增起始值
ALTER TABLE students AUTO_INCREMENT = 100;

添加和删除约束

sql
-- 添加主键
ALTER TABLE students 
ADD PRIMARY KEY (id);

-- 删除主键
ALTER TABLE students 
DROP PRIMARY KEY;

-- 添加唯一约束
ALTER TABLE students 
ADD UNIQUE KEY uk_student_no (student_no);

-- 删除唯一约束
ALTER TABLE students 
DROP INDEX uk_student_no;

-- 添加外键约束
ALTER TABLE orders
ADD CONSTRAINT fk_user
FOREIGN KEY (user_id) REFERENCES users(id);

-- 删除外键约束
ALTER TABLE orders
DROP FOREIGN KEY fk_user;

-- 添加检查约束(MySQL 8.0+)
ALTER TABLE students
ADD CONSTRAINT chk_age CHECK (age >= 0 AND age <= 150);

-- 删除检查约束
ALTER TABLE students
DROP CHECK chk_age;

删除表

sql
-- 删除表
DROP TABLE students;

-- 删除表前检查是否存在
DROP TABLE IF EXISTS students;

-- 删除多个表
DROP TABLE table1, table2, table3;

-- 清空表数据(保留表结构)
TRUNCATE TABLE students;

/*
 * DELETE vs TRUNCATE:
 * 
 * DELETE:
 * - 可以带WHERE条件
 * - 逐行删除,记录日志
 * - 不会重置AUTO_INCREMENT
 * - 可以回滚
 * 
 * TRUNCATE:
 * - 删除所有数据
 * - 整表删除,不记录日志
 * - 重置AUTO_INCREMENT
 * - 不能回滚
 * - 执行更快
 */

临时表

sql
-- 创建临时表(会话结束后自动删除)
CREATE TEMPORARY TABLE temp_users (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

-- 临时表只在当前会话可见
INSERT INTO temp_users VALUES (1, '张三');

SELECT * FROM temp_users;

-- 断开连接后临时表自动删除
-- 也可以手动删除
DROP TEMPORARY TABLE temp_users;

表复制

sql
-- 创建表示例数据
CREATE TABLE original_table (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    age INT
);

INSERT INTO original_table (name, age) VALUES
('张三', 25),
('李四', 30),
('王五', 28);

-- 复制表结构和数据
CREATE TABLE copy_table AS 
SELECT * FROM original_table;

-- 只复制表结构
CREATE TABLE structure_copy LIKE original_table;

-- 复制部分数据
CREATE TABLE partial_copy AS
SELECT id, name FROM original_table WHERE age > 26;

-- 使用INSERT...SELECT复制数据
INSERT INTO structure_copy
SELECT * FROM original_table;

本章小结

本章学习了:

  • 创建表:CREATE TABLE语法和列约束
  • 表约束:主键、外键、唯一、检查约束
  • 查看表:DESC、SHOW CREATE TABLE等命令
  • 修改表:ALTER TABLE添加、修改、删除列
  • 删除表:DROP TABLE和TRUNCATE TABLE
  • 临时表:会话级别的临时表
  • 表复制:复制表结构和数据

下一章,我们将学习数据操作,了解如何插入、更新和删除数据。