博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL DDL
阅读量:4095 次
发布时间:2019-05-25

本文共 2129 字,大约阅读时间需要 7 分钟。

摘要

MySQL生成表有两种方式,一种是通过工具,另一种是手写DDL(Data Definition Language)。通过工具设计表结构通常比较简单,这里我分享一个较好得DDL,分析点主要包括:

  • 公共字段放哪些合适?
  • 字段该选用哪种类型和类型的取值范围如何确定?
  • DDL中的关键字都代表了什么?

DDL展示

CREATE TABLE `test` (  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',  `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '名称',  `nickname` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '昵称',  `store` json DEFAULT NULL COMMENT '说明: ["KEY","VALUE"]',  `deleted` tinyint(2) unsigned DEFAULT '0' COMMENT '逻辑删除:0正常,1删除',  `created_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',  `updated_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4399 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

1、公共字段放哪些合适?

在每个表中,通常都会有创建时间(created_time)和更新时间(updated_time),deleted是代表逻辑删除,其中当值为0是表示正常,1表示被删除。

在有的项目中,通常公共字段还会有创建人(created_user)和更新人(updated_user),这俩个字段在业务表结构中几乎不会被使用到,但是在权限管理系统所用的表结构中,会非常有用,他会追踪权限的修改路径来找原因。

这里时间处理上有一个细节需要注意,由于timestamp的时间区间在1970-01-01 00:00:01.0000002038-01-19 03:14:07.999999,系统是成长的系统,谁都不想给系统埋一个定时炸弹,再说,timestamp会因为时区的问题扰乱系统时间行为(系统默认服务大陆,国际化的系统忽略此点),为了避免此些问题,转而使用datetime来记录创建时间和更新时间。

当记录新增时,updated_time初始值为null,代表了此条记录只有一个新增,没有进行其它更新操作了。

2、字段该选用哪种类型和类型的取值范围如何确定?

  • 数据/数值类型
    整数类型TINYINTSMALLINTMEDIUMINTINTBIGINT、浮点小数据类型FLOATDOUBLE、定点小数类型DECIMAL
  • 日期/时间类型
    YEARTIMEDATEDATETIMETIMESTAMP
  • 字符串类型
    CHARVARCHARBINARYVARBINARYBLOBTEXTENUMSET等。
  • 对象
    JSON
  1. 数据/数值类型
类型名称 存储需求 有符号 无符号 说明
TINYINT 1 byte -128~127 0~255 很小的整数
SMALLINT 2 bytes 32768~32767 0~65535 小的整数
MEDIUMINT 3 bytes -8388608~8388607 0~16777215 中等大小的整数
INT 4 bytes -2147483648 ~ 2147483647 0~4294967295 普通大小的整数
BIGINT 8 bytes -9223372036854775808~9223372036854775807 0~18446744073709551615 大整数
  1. 浮点数与定点数类型
类型名称 存储需求 说明
FLOAT 4 bytes 单精度浮点数
DOUBLE 8 bytes 双精度浮点数
DECIMAL(M, D) (M+2) bytes 压缩的“严格”定点数
  1. 日期与时间类型
类型名称 存储需求 日期格式 说明
YEAR 1 byte YYYY
TIME 3 bytes HH:MM:SS 时间信息
DATE 3 bytes YYYY-MM-DD 日期值
DATETIME 8 bytes YYYY-MM-DD HH:MM:SS
TIMESTAMP 4 bytes YYYY-MM-DD HH:MM:SS

3、DDL中的关键字都代表了什么?

  • unsigned
    UNSIGNED属性就是将数字类型无符号化,当整数类型的字段后被unsigned修饰时,它的组织范围会从0开始,具体如上表格(无符号)所示。

转载地址:http://wjxii.baihongyu.com/

你可能感兴趣的文章
hbase(5)---API示例
查看>>
SSM-CRUD(1)---环境搭建
查看>>
SSM-CRUD(2)---查询
查看>>
SSM-CRUD (3)---查询功能改造
查看>>
Nginx(2)---安装与启动
查看>>
springBoot(5)---整合servlet、Filter、Listener
查看>>
C++ 模板类型参数
查看>>
C++ 非类型模版参数
查看>>
设计模式 依赖倒转原则 & 里氏代换原则
查看>>
DirectX11 光照
查看>>
图形学 图形渲染管线
查看>>
DirectX11 计时和动画
查看>>
DirectX11 光照与材质的相互作用
查看>>
DirectX11 法线向量
查看>>
DirectX11 兰伯特余弦定理(Lambert)
查看>>
DirectX11 漫反射光
查看>>
DirectX11 环境光
查看>>
DirectX11 镜面光
查看>>
DirectX11 三种光照组成对比
查看>>
DirectX11 指定材质
查看>>