MySQL数据类型与表操作全指南( 从基础到高级实践)

本文主要是介绍MySQL数据类型与表操作全指南( 从基础到高级实践),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《MySQL数据类型与表操作全指南(从基础到高级实践)》本文详解MySQL数据类型分类(数值、日期/时间、字符串)及表操作(创建、修改、维护),涵盖优化技巧如数据类型选择、备份、分区,强调规范设计与...

MySQL数据类型详解

MySQL支持多种数据类型,主要分为三类:数值类型、日期/时间类型和字符串类型。

数值类型

数值类型用于存储数字,包括整数和浮点数:

类型大小(字节)范围(有符号)说明
TINYINT1-128 到 127小整数值
INT4-2147483648 到 2147483647标准整数
BIGINT8±9.22e18大整数
FLOAT4-3.402823466E+38 到 3.402823466E+38单精度浮点数
DOUBLE8±1.7976931348623157E+308双精度浮点数
DECIMAL(M,D)变长取决于M和D精确小数,M总位数,D小数位

示例:

CREATE TABLE products (
    id INT PRIMARY KEY,
    price DECIMAL(10,2), -- 总10位,含2位小数
    quantity SMALLINT UNSIGNED -- 无符号小整数
);

日期时间类型

日期和时间类型用于存储时间信息:

类型格式范围说明
DATEYYYY-MM-DD1android000-01-01 到 9999-12-31日期值
TIMEHH:MM:SS-838:59:59 到 838:59:59时间值
DATETIMEYYYY-MM-DD HH:MM:SS1000-01-01 00:00:00 到 9999-12-31 23:59:59混合日期时间
TIMESTAMPYYYY-MM-DD HH:MM:SS1970-01-01 00:00:01 到 2038-01-19 03:14:07时间戳,自动更新
YEARYYYY1901 到 2155年份值

字符串类型

字符串类型用于存储文本和二进制数据:

类型最大长度说明
CHAR(n)255字符定长字符串,空格填充
VARCHAR(n)65,535字符变长字符串,节省空间
TEXT65,535字符长文本数据
BLOB65,535字节二进制大对象
ENUM65,535项枚举类型,值从预定义列表中选择
SET64个成员集合类型,允许选择多个预定义值

示例:

CREATE TABLE users (
    username VARCHAR(50) NOT NULL,
    gender ENUM('Male','Female','Other'),
    interests SET('Music','Sports','Reading')
);

表操作全解析

创建表

基本语法:

CREATE TABLE table_name (
    column1 datatype constraints,
    column2 datatype constraints,
    ...
编程    PRIMARY KEY (one_or_more_columns)
);

完整示例:

CREATE TABLE employees (
    emp_id INT AUTO_INCREMENT,
    first_name VARCHAR(20) NOT NULL,
    last_name VARCHAR(20) NOT NULL,
    birth_date DATE,
    hire_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    salary DECIMAL(10,2) CHECK (salary > 0),
    PRIMARY KEY (emp_id),
    UNIQUE (first_name, last_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

修改表结构

添加列

ALTER TABLE employees
ADD COLUMN email VARCHAR(100) AFTER last_name;

修改列

-- 修改数据类型
ALTER TABLE emplopythonyees
MODIFY COLUMN salary DECIMAL(12,2);
-- 重命名列
ALTER TABLE employees
CHANGE COLUMN birth_date date_of_birth DATE;

删除列

ALTER TABLE employees
DROP COLUMN hire_date;

约束管理

添加主键

ALTER TABLE orders
ADD PRIMARY KEY (order_id);

添加外键

ALTER TABLE order_items
ADD CONSTRAINT fk_order
FOREIGN KEY (order_id) REFERENCES orders(order_id)
ON DELETE CASCADE;

添加唯一约束

ALTER TABLE users
ADD UNIQUE (email);

表维护操作

重命名表

RENAME TABLE old_name TO new_name;
-- 或
ALTER TABLE old_name RENAME TO new_name;

截断表

TRUNCATE TABLE log_entries; -- 快速删除所有数据

删除表

DROP TABLE IF EXISTS temp_data;

表优化技巧

  • 选择合适的数据类型
    • 用INT代替VARCHAR存储数字
    • 用DATE代替DATETIME如果不需要时间部分
    • 用ENUM代替VARCHAR存储固定选项
  • 规范命名约定
CREATE TABLE customer_orders (  -- 使用蛇形命名法
    order_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    customer_id INT UNSIGNED NOT NULL,
    order_date DATETIME DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (order_id)
);

使用注释增强可读性

CREATE TABLE payments (
    payment_id INT COMMENT '主键ID',
    amount DECIMAL(10,2) COMMENT '支付金额',
    payment_method ENUM('Credit','Paypal','Bank') 
        COMMENT '支付方式'
) COMMENT='支付信息表';

分区大表优化查询

CREATE TABLE sensor_data (
    id INT AUTO_INCREMENT,
    sensor_id INT,
    reading_time TIMESTAMP,
    value FLOAT,
    PRIMARY KEY (id, reading_time)
) PARTITION BY RANGE (YEAR(reading_time)) (
    PARTITION p2020 VALUES LESS THAN (2021),
    PARTITION p2021 VALUES LESS THAN (2022),
    PARTITION p2022 VALUES LESS THAN (2023)
);

最佳实践与注意事项

备份优先原则 执行结构变更前务必备份:

mysqldump -u root -p database_name > backup.sql
  • 外键约束影响
    • ON DELETE CASCADE:删除主表记录时自动删除从表相关记录
    • ON DELETE SET NULL:将外键设为NULL
    • 谨慎使用CASCADE避免误删连锁反应
  • 字符集选择
    • 推荐utf8mb4支持所有Unicode字http://www.chinasem.cn符(包括emoji)
    • 校对规则:utf8mb4_unicode_ci(大小写不敏感)
  • 存储引擎选择
SHOW ENGINES; -- 查看支持的引擎
  • InnoDB:支持事务、行级锁(默认)
  • MyISAM:全文索引,但不支持事务
  • Memory:数据存储在内存中
  • 性能优化
    • 避免过度使用ENUM(修改值需重建表)
    • TEXT/BLOB列单独存到副表
    • 定期分析表优化存储:
ANALYZE TABLE orders;
OPTIMIZE TABLE log_data;

实战案例:电商系统表设计

-- 商品表
CREATE TABLE products (
    product_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    description TEXT,
    price DECIMAL(10,2) UNSIGNED NOT NULL,
    stock INT UNSIGNED DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_name (name)
) ENGINE=InnoDB;
-- 订单表
CREATE TABLE orders (
    order_id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    user_id INT UNSIGNED NOT NULL,
    total_amount DECIMAL(12,2) NOT NULL,
    status ENUM('Pending','Paid','Shipped','Completed') DEFAULT 'Pending',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_user
        FOREIGN KEY (user_id) REFERENCES users(user_id)
        ON DELETE RESTRICT
) PARTITION BY HASH(order_id) PARTITIONS 4;
-- 订单明细表
CREATE TABLE order_details (
    detail_id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    order_id BIGINT UNSIGNED NOT NULL,
    product_id INT UNSIGNED NOT NULL,
    quantity SMALLINT UNSIGNED NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    CONSTRAINT fk_order
        FOREIGN KEY (order_id) REFERENCES orders(order_id)
        ON DELETE CASCADE,
    CONSTRAINT fk_product
        FOREIGN KEY (product_id) REFERENCES products(product_id)
        ON DELETE RESTRICT
);

常见问题解决方案

问题1:如何修改AUTO_INCREMENT起始值?

ALTER TABLE products AUTO_INCREMENT = 1000;

问题2:误删表如何恢复?

  • 使用备份文件恢复
  • 若无备份,尝试从binlog恢复:
mysqlbinlog --start-datetime="2023-01-01 00:00:00" binlog.000001 | mysql -u root -p

问题3:大表添加列卡顿 使用pt-online-schema-change工具在线修改:

pt-online-schema-change --alter "ADD COLUMN new_col INT" D=database,t=table --execute

问题4:存储引擎转换

ALTER TABLE orders ENGINE = InnoDB; -- 转换为InnoDB

进阶技巧

生成列(Generated Columns)

CREATE TABLE invoices (
    subtotal DECIMAL(10,2),
    tax_rate DECIMAL(5,4),
    tax_amount DECIMAL(10,2) AS (subtotal * tax_rate) STORED,
    total DECIMAL(10,2) AS (subtotal + tax_amount) STORED
);

jsON数据类型操作

CREATE TABLE product_specs (
    product_id INT PRIMARY KEY,
    specs JSON
);
INSERT INTO product_specs VALUES (1, '{"colohttp://www.chinasem.cnr": "red", "weight": 500}');
SELECT specs->>"$.color" FROM product_specs;

表空间管理

-- 创建独立表空间
CREATE TABLESPACE ts1 ADD DATAFILE 'ts1.ibd' ENGINE=InnoDB;
CREATE TABLE large_table (
    id INT PRIMARY KEY
) TABLESPACE ts1;

不可见列(MySQL 8.0+)

CREATE TABLE accounts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    balance DECIMAL(10,2) INVISIBLE
);
INSERT INTO accounts (id) VALUES (1); -- 必须显式指定可见列
SELECT * FROM accounts; -- 不显示balance列
SELECT id, balance FROM accounts; -- 显式查询

通过深入理解MySQL数据类型和表操作,可以设计出高效可靠的数据库结构。实际应用中需结合业务场景选择合适的数据类型,遵循数据库设计规范,并定期进行表结构优化维护。

到此这篇关于MySQL数据类型从基础到高级实践与表操作全指南的文章就介绍到这了,更多相关mysql数据类型内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于MySQL数据类型与表操作全指南( 从基础到高级实践)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155642

相关文章

浅谈MySQL的容量规划

《浅谈MySQL的容量规划》进行MySQL的容量规划是确保数据库能够在当前和未来的负载下顺利运行的重要步骤,容量规划包括评估当前资源使用情况、预测未来增长、调整配置和硬件资源等,感兴趣的可以了解一下... 目录一、评估当前资源使用情况1.1 磁盘空间使用1.2 内存使用1.3 CPU使用1.4 网络带宽二、

MySQL ORDER BY 语句常见用法、示例详解

《MySQLORDERBY语句常见用法、示例详解》ORDERBY是结构化查询语言(SQL)中的关键字,隶属于SELECT语句的子句结构,用于对查询结果集按指定列进行排序,本文给大家介绍MySQL... 目录mysql ORDER BY 语句详细说明1.基本语法2.排序方向详解3.多列排序4.常见用法示例5.

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

SQLServer中生成雪花ID(Snowflake ID)的实现方法

《SQLServer中生成雪花ID(SnowflakeID)的实现方法》:本文主要介绍在SQLServer中生成雪花ID(SnowflakeID)的实现方法,文中通过示例代码介绍的非常详细,... 目录前言认识雪花ID雪花ID的核心特点雪花ID的结构(64位)雪花ID的优势雪花ID的局限性雪花ID的应用场景

Java 与 LibreOffice 集成开发指南(环境搭建及代码示例)

《Java与LibreOffice集成开发指南(环境搭建及代码示例)》本文介绍Java与LibreOffice的集成方法,涵盖环境配置、API调用、文档转换、UNO桥接及REST接口等技术,提供... 目录1. 引言2. 环境搭建2.1 安装 LibreOffice2.2 配置 Java 开发环境2.3 配

Python 函数详解:从基础语法到高级使用技巧

《Python函数详解:从基础语法到高级使用技巧》本文基于实例代码,全面讲解Python函数的定义、参数传递、变量作用域及类型标注等知识点,帮助初学者快速掌握函数的使用技巧,感兴趣的朋友跟随小编一起... 目录一、函数的基本概念与作用二、函数的定义与调用1. 无参函数2. 带参函数3. 带返回值的函数4.

MySQL中DATE_FORMAT时间函数的使用小结

《MySQL中DATE_FORMAT时间函数的使用小结》本文主要介绍了MySQL中DATE_FORMAT时间函数的使用小结,用于格式化日期/时间字段,可提取年月、统计月份数据、精确到天,对大家的学习或... 目录前言DATE_FORMAT时间函数总结前言mysql可以使用DATE_FORMAT获取日期字段

在 Spring Boot 中连接 MySQL 数据库的详细步骤

《在SpringBoot中连接MySQL数据库的详细步骤》本文介绍了SpringBoot连接MySQL数据库的流程,添加依赖、配置连接信息、创建实体类与仓库接口,通过自动配置实现数据库操作,... 目录一、添加依赖二、配置数据库连接三、创建实体类四、创建仓库接口五、创建服务类六、创建控制器七、运行应用程序八

深入解析Java NIO在高并发场景下的性能优化实践指南

《深入解析JavaNIO在高并发场景下的性能优化实践指南》随着互联网业务不断演进,对高并发、低延时网络服务的需求日益增长,本文将深入解析JavaNIO在高并发场景下的性能优化方法,希望对大家有所帮助... 目录简介一、技术背景与应用场景二、核心原理深入分析2.1 Selector多路复用2.2 Buffer

MySQL 升级到8.4版本的完整流程及操作方法

《MySQL升级到8.4版本的完整流程及操作方法》本文详细说明了MySQL升级至8.4的完整流程,涵盖升级前准备(备份、兼容性检查)、支持路径(原地、逻辑导出、复制)、关键变更(空间索引、保留关键字... 目录一、升级前准备 (3.1 Before You Begin)二、升级路径 (3.2 Upgrade