【MySQL基础】MySQL表操作全面指南:从创建到管理的深度解析

【MySQL基础】MySQL表操作全面指南:从创建到管理的深度解析

MySQL学习:

https://blog.ZEEKLOG.net/2301_80220607/category_12971838.html?spm=1001.2014.3001.5482

前言:

在上一篇我们学习了库的创建和使用,表是其存储数据的核心结构。本文将全面讲解MySQL中关于表的各项操作,包括创建、修改、删除等,并深入探讨相关知识点和注意事项。

表的基本概念

在MySQL中,表是存储数据的主要对象,由行和列组成。理解表的基本结构对数据库设计至关重要。

表的主要组成部分

组成部分描述
表名表的唯一标识符,遵循命名规则
列(字段)表的垂直结构,定义数据的类型和约束
行(记录)表的水平结构,实际存储的数据
主键唯一标识表中每一行的列或列组合
索引提高查询性能的数据结构
约束

保证数据完整性的规则

创建表

基本语法

CREATE TABLE [IF NOT EXISTS] table_name ( column1 datatype [constraints] [COMMENT 'column_comment'], column2 datatype [constraints] [COMMENT 'column_comment'], ..., [table_constraints] ) [ENGINE=storage_engine] [CHARACTER SET charset] [COLLATE collation] [COMMENT 'table_comment'] [PARTITION BY partition_type (partition_expression)];

语法各部分详细说明

CREATE TABLE:创建表的核心关键字[IF NOT EXISTS]:可选子句,避免表已存在时报错table_name:要创建的表的名称(遵循命名规则)列定义部分column1column2:列名(字段名)datatype:列的数据类型(如INT, VARCHAR等)[constraints]:可选的列约束(如NOT NULL, UNIQUE等)[COMMENT]:可选的列注释table_constraints:表级约束(如PRIMARY KEY, FOREIGN KEY等)ENGINE:指定表的存储引擎(如InnoDB, MyISAM)CHARACTER SET:指定表的字符集(如utf8mb4)COLLATE:指定表的排序规则(如utf8mb4_general_ci)COMMENT:可选的表注释PARTITION BY:可选的分区定义

关键参数说明

参数描述示例注意事项
IF NOT EXISTS避免表已存在时报错CREATE TABLE IF NOT EXISTS users不会检查表结构是否相同
列定义列名+数据类型+约束username VARCHAR(50) NOT NULL COMMENT '用户登录名'列名不能重复
数据类型定义列存储的数据类型INTVARCHAR(255)DECIMAL(10,2)选择最合适的数据类型
列约束限制列中数据的规则NOT NULLUNIQUEDEFAULT 'value'约束越多,性能开销越大
表级约束应用于整个表的约束PRIMARY KEY (id)FOREIGN KEY (dept_id) REFERENCES departments(id)复合主键必须在此定义
存储引擎指定表的存储引擎ENGINE=InnoDBMySQL 5.5+默认InnoDB
字符集指定表的默认字符集CHARACTER SET utf8mb4推荐utf8mb4支持完整Unicode
排序规则指定字符比较规则COLLATE utf8mb4_general_ci_ci表示不区分大小写
注释为表或列添加描述COMMENT '员工基本信息表'有助于文档化

数据类型详解

MySQL支持多种数据类型,主要分为几大类:

数值类型

  • 整数:TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT
  • 小数:FLOAT, DOUBLE, DECIMAL(精确小数)

字符串类型

  • 定长:CHAR(0-255)
  • 变长:VARCHAR(0-65535)
  • 文本:TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT
  • 二进制:BLOB系列

日期时间类型

  • DATE:YYYY-MM-DD
  • TIME:HH:MM:SS
  • DATETIME:YYYY-MM-DD HH:MM:SS
  • TIMESTAMP:时间戳(1970-2038)
  • YEAR:年份

其他类型

  • ENUM:枚举值
  • SET:集合
  • JSON:MySQL 5.7+支持

约束类型详解

约束类型语法描述示例
NOT NULLcol_name datatype NOT NULL列不能存储NULL值name VARCHAR(50) NOT NULL
UNIQUEcol_name datatype UNIQUE列中所有值必须不同email VARCHAR(100) UNIQUE
PRIMARY KEYPRIMARY KEY (col1, col2)唯一标识表中每行id INT AUTO_INCREMENT PRIMARY KEY
FOREIGN KEYFOREIGN KEY (col) REFERENCES table(col)强制引用完整性FOREIGN KEY (dept_id) REFERENCES departments(id)
CHECKCHECK (condition)确保列值满足条件salary DECIMAL CHECK (salary > 0)
DEFAULTcol_name datatype DEFAULT value未指定值时使用默认值created_at TIMESTAM

完整示例

建立一个学生表student

CREATE TABLE Student (Sno CHAR(8) PRIMARY KEY, /*列级完整性约束条件,Sno是主码*/ Sname VARCHAR(20) UNIQUE, /*sname取唯一值*/ Ssex CHAR(6), Sbirthdate Date, Smajor VARCHAR(40) )character set utf8 engine MyISAM;

建立一个员工表,这个比较复杂,涉及到约束问题,简单看一下了解一下就行,后面会针对约束问题专门开一篇

CREATE TABLE IF NOT EXISTS employees ( emp_id INT AUTO_INCREMENT COMMENT '员工ID,自动递增', first_name VARCHAR(50) NOT NULL COMMENT '名字', last_name VARCHAR(50) NOT NULL COMMENT '姓氏', email VARCHAR(100) UNIQUE COMMENT '邮箱地址,唯一', hire_date DATE NOT NULL COMMENT '入职日期', salary DECIMAL(10,2) CHECK (salary > 0) COMMENT '薪水,必须大于0', dept_id INT COMMENT '部门ID', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间', updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录最后更新时间', -- 表级约束 PRIMARY KEY (emp_id), INDEX idx_name (last_name, first_name) COMMENT '姓名组合索引', CONSTRAINT fk_dept FOREIGN KEY (dept_id) REFERENCES departments(dept_id) ) ENGINE=InnoDB CHARACTER SET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='公司员工信息表';

创建表时的注意事项

索引设计

不要过度索引(影响写入性能)为常用查询条件创建索引考虑组合索引的顺序

关于索引和表的约束的问题,我们留在后面几篇细讲,下面出现的所有的关于索引和表的约束的问题都可以先忽略

字符集选择

推荐utf8mb4而非utf8(完整支持Unicode包括emoji)数据库、表、列字符集保持一致

存储引擎选择

InnoDB:支持事务、外键(MySQL 5.5+默认)MyISAM:全文本搜索,但不支持事务(MySQL 5.5前默认)MEMORY:数据存储在内存中

主键设计

每表应有主键优先使用自增整数(简单高效)复合主键谨慎使用避免使用业务数据作为主键

数据类型选择

选择能满足需求的最小数据类型(如用TINYINT存储0-100的值)考虑未来扩展性(如VARCHAR长度适当放大)对于字符串,VARCHAR比CHAR更节省空间(除非长度固定)金额等精确计算使用DECIMAL而非FLOAT/DOUBLE

命名规范

使用有意义的名称(如employees而非tbl1)建议使用小写字母和下划线组合(如employee_salaries)避免使用MySQL保留字(如order, group等)保持一致性(如全部单数或复数形式)

查看表结构

show tables;

通过这个我们可以查看我们当前所在的数据库中都有哪些表

desc 表名;

而这个语句则能帮助我们直接查看指定的数据表的结构

修改表结构

随着需求变化,经常需要修改已有表的结构。

常用ALTER TABLE操作详解

操作类型语法示例说明注意事项
添加列

ALTER TABLE table ADD COLUMN col_name datatype [constraints] [AFTER existing_col]

添加新列大表操作可能耗时
修改列ALTER TABLE table MODIFY COLUMN col_name new_datatype [constraints]修改列定义数据类型变更可能导致数据丢失
重命名列ALTER TABLE table CHANGE COLUMN old_name new_name datatype [constraints]修改列名和定义必须包含数据类型
删除列ALTER TABLE table DROP COLUMN col_name删除现有列不可逆操作
添加约束ALTER TABLE table ADD CONSTRAINT constraint_name constraint_def添加主键、外键等外键需确保数据一致
删除约束ALTER TABLE table DROP CONSTRAINT constraint_name删除约束主键约束名为PRIMARY
重命名表ALTER TABLE old_name RENAME TO new_name 或 RENAME TABLE old_name TO new_name修改表名需更新相关视图、存储过程
修改引擎ALTER TABLE table ENGINE=InnoDB更改存储引擎可能锁表
添加索引ALTER TABLE table ADD INDEX idx_name (col1, col2)添加普通索引避免重复索引
添加全文索引ALTER TABLE table ADD FULLTEXT idx_name (text_col)添加全文索引仅MyISAM和InnoDB支持
修改字符集ALTER TABLE table CONVERT TO CHARACTER SET charset COLLATE collation修改表字符集将转换现有数据

修改表示例

-- 添加新列(指定位置) ALTER TABLE employees ADD COLUMN phone VARCHAR(20) NOT NULL AFTER email; -- 修改列数据类型和约束 ALTER TABLE employees MODIFY COLUMN salary DECIMAL(12,2) CHECK (salary >= 0); -- 重命名列(必须指定数据类型) ALTER TABLE employees CHANGE COLUMN phone mobile_phone VARCHAR(20); -- 添加外键约束(命名约束) ALTER TABLE employees ADD CONSTRAINT fk_department FOREIGN KEY (dept_id) REFERENCES departments(id) ON DELETE SET NULL ON UPDATE CASCADE; -- 添加组合索引 ALTER TABLE employees ADD INDEX idx_name_department (last_name, dept_id); -- 修改表注释 ALTER TABLE employees COMMENT='公司员工基本信息表'; -- 重命名表(两种方式) ALTER TABLE employees RENAME TO staff; -- 或 RENAME TABLE employees TO staff; -- 修改存储引擎 ALTER TABLE employees ENGINE=InnoDB; -- 修改字符集(转换现有数据) ALTER TABLE employees CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

修改表时的注意事项

索引管理

添加索引可能加快查询但减慢写入监控未使用索引组合索引顺序很重要(最左前缀原则)

测试环境验证

所有结构变更先在测试环境验证备份重要数据(特别是生产环境)考虑使用事务(部分ALTER支持)

外键约束

添加外键前确保引用数据已存在删除有外键引用的表需先删除约束考虑外键操作(ON DELETE/UPDATE)

数据类型变更风险

缩小数据类型可能导致数据截断(如VARCHAR(100)改为VARCHAR(50))某些类型转换可能不支持(如TEXT转INT)变更前检查数据兼容性

大表修改

大表结构变更可能锁表很长时间(百万级以上)考虑使用在线DDL工具(pt-online-schema-change)在低峰期执行先创建新表再迁移数据(对于重大变更)

删除表

删除表是不可逆操作,需谨慎执行。

基本语法详解

DROP [TEMPORARY] TABLE [IF EXISTS] table_name [, table_name2...] [RESTRICT | CASCADE];

语法各部分详细说明

  1. DROP TABLE:删除表的核心关键字
  2. [TEMPORARY]:可选,仅删除临时表
  3. [IF EXISTS]:避免表不存在时报错
  4. table_name:要删除的表名(可多个,逗号分隔)
  5. [RESTRICT]:默认选项,如果有依赖对象则拒绝删除
  6. [CASCADE]:级联删除依赖对象(慎用)

删除表示例

-- 安全删除单个表 DROP TABLE IF EXISTS temp_users; -- 删除多个表 DROP TABLE temp_table1, temp_table2; -- 仅删除临时表 DROP TEMPORARY TABLE temp_session_data; -- 使用CASCADE强制删除(慎用) DROP TABLE departments CASCADE;

相关删除操作对比

操作语法描述是否可恢复
DROP TABLEDROP TABLE table_name删除整个表结构和数据不可恢复
TRUNCATE TABLETRUNCATE TABLE table_name删除表中所有数据但保留结构不可恢复
DELETEDELETE FROM table_name [WHERE]删除部分或全部数据可回滚

删除表时的注意事项

  1. 备份数据
    • 删除前确认数据已备份
    • 重要表考虑先重命名而非直接删除
    • 使用CREATE TABLE new_table SELECT * FROM old_table快速备份
  2. 依赖关系检查
    • 检查是否有视图、存储过程、触发器依赖该表
    • 权限控制
      • 限制DROP TABLE权限
      • 使用数据库角色管理权限
      • 生产环境实施权限分离
    • 替代方案
      • 考虑TRUNCATE TABLE清空数据但保留结构
      • 临时表可使用CREATE TEMPORARY TABLE自动会话结束时删除
      • 归档数据而非删除
    • 事务考虑
      • DROP TABLE是隐式提交的操作(即使在使用事务中)
      • 不能在事务中回滚DROP TABLE操作

检查外键约束

SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = '要删除的表名';

表操作的最佳实践

设计阶段

文档化

维护数据字典使用注释说明表和列的用途记录变更历史

命名约定

规范化设计

遵循适当的范式(通常3NF)平衡规范化和性能需求避免过度规范化导致的复杂连接
感谢各位大佬观看,创作不易,还望各位大佬点赞支持!!

Read more

龙虾机器人(OpenClaw)本地部署完全技术指南

龙虾机器人(OpenClaw)本地部署完全技术指南

龙虾机器人(OpenClaw)本地部署完全技术指南 前言:什么是“龙虾机器人”? 在开始部署之前,我们需要明确部署的对象。通常所说的“龙虾机器人”指的是开源项目 OpenClaw(曾用名:Clawdbot、Moltbot)。它由程序员彼得·斯坦伯格开发,是一个开源的、可本地部署的通用型AI代理系统。与ChatGPT等对话式AI不同,OpenClaw被赋予了操作系统的权限:它可以执行终端命令、读写文件、操控浏览器、安装软件,甚至通过MCP协议调用外部工具。 由于其强大的系统操控能力,安全性是部署时需关注的首要问题。官方及社区普遍建议:不要在主力机或存有敏感数据的生产环境直接裸奔部署,最好使用虚拟机、Docker容器或专用硬件(如Mac Mini或AI开发盒子)进行隔离。 第一章:环境准备与核心依赖 在安装OpenClaw之前,必须准备好运行环境。OpenClaw的核心由TypeScript编写,因此Node.js是必不可少的运行环境。此外,根据安装方式的不同,可能还需要Git、Docker或Python环境。 1.1 硬件建议与系统选择 * Linux

By Ne0inhk
Flutter 三方库 arcane_helper_utils 的鸿蒙化适配指南 - 实现具备通用逻辑增强与多维开发脚手架的实用工具集、支持端侧业务开发的效率倍增实战

Flutter 三方库 arcane_helper_utils 的鸿蒙化适配指南 - 实现具备通用逻辑增强与多维开发脚手架的实用工具集、支持端侧业务开发的效率倍增实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 arcane_helper_utils 的鸿蒙化适配指南 - 实现具备通用逻辑增强与多维开发脚手架的实用工具集、支持端侧业务开发的效率倍增实战 前言 在进行 Flutter for OpenHarmony 开发时,如何快速处理常见的字符串格式化、色值转换、日期计算或布尔值增强?虽然每一个功能都很小,但如果每个项目都重复造轮子,开发效率将大打折扣。arcane_helper_utils 是一款专注于极致实用的“瑞士军刀”型工具集。本文将探讨如何在鸿蒙端通过这类高内聚的 Utility 集实现极致、丝滑的业务交付。 一、原直观解析 / 概念介绍 1.1 基础原理 该库通过对 Dart 原生类型(Object, String, List, Map, Bool)

By Ne0inhk
【数学建模】用代码搞定无人机烟幕:怎么挡导弹最久?

【数学建模】用代码搞定无人机烟幕:怎么挡导弹最久?

前言:欢迎各位光临本博客,这里小编带你直接手撕**,文章并不复杂,愿诸君耐其心性,忘却杂尘,道有所长!!!! **🔥个人主页:IF’Maxue-ZEEKLOG博客 🎬作者简介:C++研发方向学习者 📖**个人专栏: 《C语言》 《C++深度学习》 《Linux》 《数据结构》 《数学建模》** ⭐️人生格言:生活是默默的坚持,毅力是永久的享受。不破不立,远方请直行! 文章目录 * 一、先搞懂:我们要解决啥问题? * 二、核心计算:代码怎么判断“烟幕有没有用”? * 1. 先算单个烟幕的“有效时间段” * 2. 合并重叠的时间段(避免重复计算) * 3. 只算“导弹到达前”的有效时间 * 三、代码优化:加了2个实用功能,结果直接看 * 1. 跑完直接显示“最优遮蔽时长”

By Ne0inhk

【福利教程】一键解锁 ChatGPT / Gemini / Spotify 教育权益!TG 机器人全自动验证攻略

想要免费使用 ChatGPT 教师版(直至 2027 年)?想白嫖 Gemini Advanced 一年?还是想以学生优惠价订阅 Spotify? 无需繁琐的资料证明,现在只需要一个 Telegram 机器人,即可自动化完成 SheerID 身份认证,轻松解锁各类教育版专属福利! 🎁 你能获取哪些权益? 通过此机器人协助验证,你可以获取以下顶级服务的教育/学生权益: 1. 🤖 ChatGPT K-12 教师版 * 权益:美国 K-12 教育工作者专属福利,相当于 Plus 会员体验。 * 有效期:免费使用至 2027 年 6 月。 1. ✨ Gemini One Pro (教育版) * 权益:Google 最强 AI

By Ne0inhk