1. 首页 > MySQL教程 > 正文

MySQL教程FG075-MySQL DDL语句详解

内容简介:本文主要介绍MySQL相关知识,包括安装、配置、优化等内容。风哥教程参考MySQL官方文档MySQL SQL Syntax、MySQL Server Administration。 01 更多视频教程www.fgedu.net.cn 02 学习交流加群风哥微信: itpux-com

Part01-基础概念与理论知识

DDL(Data Definition Language,数据定义语言)是SQL语言的一个重要组成部分,用于定义和管理数据库对象的结构。在MySQL中,DDL语句主要用于创建、修改、删除数据库、表、索引、视图、存储过程等数据库对象。 03 学习交流加群风哥QQ113257174

1.1 DDL语句的特点

  • DDL语句执行后会自动提交,不需要手动COMMIT
  • DDL语句会隐式地对相关对象加锁,可能会影响数据库性能
  • DDL语句执行后会导致数据库对象的结构发生变化

1.2 常用DDL语句分类

类别 语句 作用
数据库操作 CREATE DATABASE, ALTER DATABASE, DROP DATABASE 创建、修改、删除数据库
表操作 CREATE TABLE, ALTER TABLE, DROP TABLE, TRUNCATE TABLE 创建、修改、删除、截断表
索引操作 CREATE INDEX, ALTER INDEX, DROP INDEX 创建、修改、删除索引
视图操作 CREATE VIEW, ALTER VIEW, DROP VIEW 创建、修改、删除视图
存储对象操作 CREATE PROCEDURE, CREATE FUNCTION, CREATE TRIGGER 创建存储过程、函数、触发器

Part02-生产环境规划与建议

2.1 创建数据库

-- 创建数据库
CREATE DATABASE test_db;

-- 创建数据库并指定字符集和排序规则
CREATE DATABASE test_db 
    CHARACTER SET utf8mb4 
    COLLATE utf8mb4_unicode_ci;

2.2 修改数据库

-- 修改数据库字符集
ALTER DATABASE test_db 
    CHARACTER SET utf8mb4 
    COLLATE utf8mb4_unicode_ci;

2.3 删除数据库

-- 删除数据库
DROP DATABASE test_db;

-- 安全删除数据库(如果存在)
DROP DATABASE IF EXISTS test_db;

Part03-生产环境项目实施方案

3.1 创建表

-- 创建基本表
CREATE TABLE employees (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    age INT,
    department VARCHAR(50),
    hire_date DATE,
    salary DECIMAL(10,2)
);

-- 创建带索引的表
CREATE TABLE employees (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    age INT,
    department VARCHAR(50),
    hire_date DATE,
    salary DECIMAL(10,2),
    INDEX idx_department (department),
    INDEX idx_hire_date (hire_date)
);

-- 创建带外键的表
CREATE TABLE departments (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL
);

CREATE TABLE employees (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    age INT,
    department_id INT,
    hire_date DATE,
    salary DECIMAL(10,2),
    FOREIGN KEY (department_id) REFERENCES departments(id)
);

3.2 修改表

-- 添加列
ALTER TABLE employees ADD COLUMN email VARCHAR(100);

-- 修改列类型
ALTER TABLE employees MODIFY COLUMN age TINYINT;

-- 修改列名
ALTER TABLE employees CHANGE COLUMN email employee_email VARCHAR(100);

-- 删除列
ALTER TABLE employees DROP COLUMN employee_email;

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

-- 添加索引
ALTER TABLE employees ADD INDEX idx_name (name);

-- 添加外键
ALTER TABLE employees ADD FOREIGN KEY (department_id) REFERENCES departments(id);

3.3 删除表

-- 删除表
DROP TABLE employees;

-- 安全删除表(如果存在)
DROP TABLE IF EXISTS employees;

-- 删除多个表
DROP TABLE IF EXISTS employees, departments;

3.4 截断表

-- 截断表(删除所有数据,但保留表结构)
TRUNCATE TABLE employees;

Part04-生产案例与实战讲解

4.1 创建索引

-- 创建普通索引
CREATE INDEX idx_name ON employees(name);

-- 创建唯一索引
CREATE UNIQUE INDEX idx_email ON employees(email);

-- 创建复合索引
CREATE INDEX idx_dept_hire ON employees(department, hire_date);

-- 创建全文索引
CREATE FULLTEXT INDEX idx_description ON products(description);

4.2 修改索引

-- 重命名索引(MySQL 5.7+)
ALTER TABLE employees RENAME INDEX idx_name TO idx_employee_name;

4.3 删除索引

-- 删除索引
DROP INDEX idx_name ON employees;

-- 或使用ALTER TABLE删除索引
ALTER TABLE employees DROP INDEX idx_name;

Part05-风哥经验总结与分享

5.1 创建视图

-- 创建基本视图
CREATE VIEW employee_view AS
SELECT id, name, department, salary
FROM employees
WHERE salary > 5000;

-- 创建带检查选项的视图
CREATE VIEW employee_view AS
SELECT id, name, department, salary
FROM employees
WHERE salary > 5000
WITH CHECK OPTION;

5.2 修改视图

-- 修改视图
ALTER VIEW employee_view AS
SELECT id, name, department, salary, hire_date
FROM employees
WHERE salary > 6000;

-- 或使用CREATE OR REPLACE修改视图
CREATE OR REPLACE VIEW employee_view AS
SELECT id, name, department, salary, hire_date
FROM employees
WHERE salary > 6000;

5.3 删除视图

-- 删除视图
DROP VIEW employee_view;

-- 安全删除视图(如果存在)
DROP VIEW IF EXISTS employee_view;

6. 存储对象DDL操作

6.1 创建存储过程

-- 创建存储过程
DELIMITER //
CREATE PROCEDURE get_employee(IN emp_id INT)
BEGIN
    SELECT * FROM employees WHERE id = emp_id;
END //
DELIMITER ;

6.2 创建函数

-- 创建函数
DELIMITER //
CREATE FUNCTION calculate_bonus(salary DECIMAL(10,2)) RETURNS DECIMAL(10,2)
BEGIN
    RETURN salary * 0.1;
END //
DELIMITER ;

6.3 创建触发器

-- 创建触发器
DELIMITER //
CREATE TRIGGER before_employee_insert
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
    SET NEW.hire_date = NOW();
END //
DELIMITER ;

7. DDL语句最佳实践

7.1 数据库设计最佳实践

  • 在创建数据库时指定合适的字符集和排序规则
  • 为数据库对象选择合适的命名规范
  • 定期备份数据库结构

7.2 表设计最佳实践

  • 为表选择合适的存储引擎(推荐InnoDB)
  • 为表设置合适的字符集
  • 合理设计表结构,避免过多列
  • 为常用查询字段创建索引
  • 使用合适的数据类型,避免使用过大的数据类型

7.3 索引设计最佳实践

  • 只为常用查询的字段创建索引
  • 避免在频繁更新的字段上创建索引
  • 合理设计复合索引的顺序
  • 定期维护和优化索引

7.4 DDL操作性能优化

  • 在低峰期执行DDL操作
  • 对于大表,使用在线DDL(MySQL 5.6+)
  • 执行DDL操作前备份数据
  • 使用pt-online-schema-change等工具执行大表的结构变更

8. 常见错误和解决方案

8.1 数据库创建错误

错误信息 原因 解决方案
ERROR 1007 (HY000): Can’t create database ‘test_db’; database exists 数据库已存在 使用CREATE DATABASE IF NOT EXISTS或先删除现有数据库
ERROR 1044 (42000): Access denied for user ‘user’@’localhost’ to database ‘test_db’ 权限不足 确保用户有创建数据库的权限

8.2 表操作错误

错误信息 原因 解决方案
ERROR 1050 (42S01): Table ’employees’ already exists 表已存在 使用CREATE TABLE IF NOT EXISTS或先删除现有表
ERROR 1215 (HY000): Cannot add foreign key constraint 外键约束创建失败 确保父表存在,且字段类型匹配
ERROR 1067 (42000): Invalid default value for ‘hire_date’ 默认值无效 为日期字段设置有效的默认值

8.3 索引操作错误

错误信息 原因 解决方案
ERROR 1061 (42000): Duplicate key name ‘idx_name’ 索引名重复 使用不同的索引名
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes 索引键长度超过限制 缩短索引字段长度或使用前缀索引

9. 示例演示

9.1 完整的数据库和表创建示例

-- 创建数据库
CREATE DATABASE company_db 
    CHARACTER SET utf8mb4 
    COLLATE utf8mb4_unicode_ci;

-- 使用数据库
USE company_db;

-- 创建部门表
CREATE TABLE departments (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    description TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 创建员工表
CREATE TABLE employees (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    age TINYINT,
    department_id INT,
    position VARCHAR(50),
    salary DECIMAL(10,2),
    hire_date DATE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (department_id) REFERENCES departments(id),
    INDEX idx_department (department_id),
    INDEX idx_position (position),
    INDEX idx_salary (salary)
);

-- 创建视图
CREATE VIEW high_salary_employees AS
SELECT e.id, e.name, e.position, e.salary, d.name AS department
FROM employees e
JOIN departments d ON e.department_id = d.id
WHERE e.salary > 8000;

-- 插入测试数据
INSERT INTO departments (name, description) VALUES
('技术部', '负责公司技术开发'),
('市场部', '负责公司市场推广'),
('人力资源部', '负责人力资源管理');

INSERT INTO employees (name, age, department_id, position, salary, hire_date) VALUES
('风哥1号', 28, 1, '软件工程师', 10000, '2023-01-15'),
('风哥2号', 32, 1, '技术主管', 15000, '2022-06-10'),
('王五', 25, 2, '市场专员', 6000, '2023-03-20'),
('赵六', 35, 3, '人力资源经理', 9000, '2021-11-05');

-- 查询视图
SELECT * FROM high_salary_employees;

9.2 表结构修改示例

-- 添加新列
ALTER TABLE employees ADD COLUMN email VARCHAR(100);

-- 修改列类型
ALTER TABLE employees MODIFY COLUMN salary DECIMAL(12,2);

-- 添加新索引
ALTER TABLE employees ADD INDEX idx_email (email);

-- 重命名表
ALTER TABLE employees RENAME TO company_employees;

-- 查看表结构
DESCRIBE company_employees;

10. 总结

DDL语句是MySQL数据库管理的重要组成部分,用于定义和管理数据库对象的结构。本文详细介绍了MySQL中常用的DDL语句,包括数据库操作、表操作、索引操作、视图操作和存储对象操作等。 04 风哥提示:

在使用DDL语句时,需要注意以下几点: 05更多学习教程公众号风哥教程itpux_com

  • DDL语句执行后会自动提交,无法回滚
  • 对于大表的结构变更,应选择合适的时机并使用在线DDL
  • 执行DDL操作前应备份数据,以防意外情况
  • 遵循最佳实践,合理设计数据库结构和索引

通过掌握DDL语句的使用方法,可以有效地管理MySQL数据库结构,提高数据库的性能和可维护性。 06 from mysql视频:www.itpux.com

GF-MySQL数据库培训文档系列

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息