到底怎样才能创建一张规范的MySQL表?

为什么必定需要有无业务意义的主键,并且还需要自增?

应该在哪些字段添加索引?

或许有些人会有以上类似的疑问.这几天通过本身的整理加上好友的指导,整理了一份稍微规范一点的建表语句.

如下:规范表示例

MySQL 5.5

CREATE TABLE student_info (

`id` INT (11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',

`stu_name` VARCHAR (10) NOT NULL DEFAULT '' COMMENT '姓名',

`stu_class` VARCHAR (10) NOT NULL DEFAULT '' COMMENT '班级',

`stu_num` INT (11) NOT NULL DEFAULT '0' COMMENT '学号',

`stu_score` SMALLINT UNSIGNED NOT NULL DEFAULT '0' COMMENT '总分',

`tuition` DECIMAL (5, 2) NOT NULL DEFAULT '0' COMMENT '学费',

`phone_number` VARCHAR (20) NOT NULL DEFAULT '0' COMMENT '电话号码',

`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',

`update_time` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '记录更新时间',

`status` TINYINT NOT NULL DEFAULT '1' COMMENT '1代表记录有效,0代表记录无效',

PRIMARY KEY (`id`),

UNIQUE KEY uniq_stu_num (`stu_num`),

KEY idx_stu_score (`stu_score`),

KEY idx_update_time_tuition (`update_time`, `tuition`)

) ENGINE = INNODB charset = utf8mb4 COMMENT '学生信息表';

MySQL 5.6及以上版本

CREATE TABLE student_info (

`id` INT (11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',

`stu_name` VARCHAR (10) NOT NULL DEFAULT '' COMMENT '姓名',

`stu_class` VARCHAR (10) NOT NULL DEFAULT '' COMMENT '班级',

`stu_num` INT (11) NOT NULL DEFAULT '0' COMMENT '学号',

`stu_score` SMALLINT UNSIGNED NOT NULL DEFAULT '0' COMMENT '总分',

`tuition` DECIMAL (5, 2) NOT NULL DEFAULT '0' COMMENT '学费',

`phone_number` VARCHAR (20) NOT NULL DEFAULT '0' COMMENT '电话号码',

`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',

`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录更新时间',

`status` TINYINT NOT NULL DEFAULT '1' COMMENT '1代表记录有效,0代表记录无效',

PRIMARY KEY (`id`),

UNIQUE KEY uniq_stu_num (`stu_num`),

KEY idx_stu_score (`stu_score`),

KEY idx_update_time_tuition (`update_time`, `tuition`)

) ENGINE = INNODB charset = utf8mb4 COMMENT '学生信息表';解释

1、表的命名:使用有意义的英文词汇,词汇中间以下划线分割,全部采用小写;如示例表表名student_info

2、表必需有无符号int型自增主键,对应示例表中id字段.

必需得有主键的原因:

采用RBR模式复制,无主键的表删除,会导致备库夯住

使用自增的原因:

数据写入可以提高插入性能,避免page分裂,减少表碎片.

3、必需把字段定义为NOT NULL并且提供默认值

原因:

a.null的列使索引、统计都更加复杂,使优化更加困难

b.NULL并不是空值,也会占用空间,所以在MySQL进行比拟时,NULL会参与字段比拟,所以对效率有一部分影响

4、所有表、字段都应该有 comment ,来描述表、字段所代表的含义,便利同事查看.

5、能用SMALLINT或者tinyint的情况就不用int,如字段 stu_score就使用的是SMALLINT

原因:使用SMALLINT或者tinyint能节约存储空间

6、涉及到钱的字段建议使用DECIMAL,如示例表字段tuition

7、电话号码建议使用varchar(20),如示例表字段phone_number

原因:

a.涉及到区号或者国家代号,可能出现+-()

b.不会有谁用手机号做运算吧

c.varchar可以支持模糊查询

8、表建议增加create_time和update_time,以记录某条数据的创建时间和修改时间.

注意:这里5.5和5.6有区别,5.5使用的是TIMESTAMP,并且5.5不支持多个CURRENT_TIMESTAMP 默认值,因此如上示例设计;5.6版本使用了datetime,因为datetime支持的范围更广(范围为:'1000-01-01 00:00:00'到'9999-12-31 23:59:59'),并且create_time和update_time两个字段都设置了CURRENT_TIMESTAMP(从5.6.5开始支持多个字段默认值设置为CURRENT_TIMESTAMP)

原因:增加这两个字段便利统计和归档.

9、表建议包括一个状态标记字段,来标识数据是否被删除,而不使用物理删除;比如示例表字段status.

10、不建议使用ENUM,使用TINYINT来代替;如示例表字段status使用的是TINYINT类型.

原因:增加新的ENUM值要做DDL操作

11、使用唯一索引约束字段值唯一的数据,唯一索引以uniq_字段名方式命名;如示例表中的uniq_stu_num

12、在经常作为查询条件的字段上添加索引,普通索引以idx_字段名方式命名;如示例表中的idx_stu_score

13、经常同时出现在where条件中的几个字段可以放在联合索引中;如idx_update_time_tuition;必要注意的是应该把选择性更大的列放在联合索引的最左边.

14、尽量不使用TEXT、BLOB类型

原因:会浪费更多的磁盘和内存空间,非需要的大量的大字段查询会淘汰掉热数据,导致内存命中率急剧降低,影响数据库性能

15、建议使用innodb存储引擎

原因:innodb支持事务,是行级锁,并发性能更好、CPU及内存缓存页优化使得资源利用率更高.

16、建议使用utf8mb4字符集

原因:万国码,无乱码风险;与utf8编码相比,能支持Emoji脸色.

如何创建一张表mysql_如何创建一张规范的MySQL表相关推荐

  1. php mysql 到表最后_如何在PHP中获取MySQL表的最后插入ID?

    如何在PHP中获取MySQL表的最后插入ID? 我有一张表,经常插入新数据. 我需要获取表格的最后一个ID. 我怎样才能做到这一点? 它类似于SELECT MAX(id) FROM table吗? g ...

  2. plsql tables 没有表_技术分享 | 在磁盘上查找 MySQL 表的大小

    作者:Peter Zaitsev 翻译:管长龙 我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎.不应该在 INFORMATION_SCHEMA.TABLES 中提供这些信息吗?没那么简单 ...

  3. mysql表analyze,ANALYZE TABLE语句如何帮助维护MySQL表?

    MySQL查询优化器是MySQL服务器的重要组成部分,可为查询设置最佳的问题执行.对于特定查询,查询优化器使用存储的键分布和其他因素来确定执行联接时应联接表的顺序以及特定表应使用哪个索引. 但是,键分 ...

  4. mysql 污表_Time Machine 华丽营救被污的 MySQL 表

    之前换新 Mac 时,Time Machine 来做的 OS X 数据迁移,立了大功.最近又立一小功. 作为一名程序员,我写了不少自己日常用的小工具,其中一些以 Web 形式搭建在自己的 Mac 上. ...

  5. mysql创建表时表明加单引号_python在MySQL表名周围插入单引号(‘)

    我有一个名为project1的数据库,其中包含以下表格: _systbl1 _systbl2 _systbl3 dataset1 dataset2 dataset3 每当添加一个新用户时,都需要授予M ...

  6. mysql表中插中文报错_向mysql表中插入含有中文的数据时报错:[Err] 1366

    创建的表及插入语句如下: create table students (name varchar(25), class varchar(25), grade int); insert into stu ...

  7. mysql 表名 下划线_我们可以在MySQL表名中加下划线吗?

    您不能在表名称中添加下划线.如果您仍想使用下划线创建新表,请使用反引号(而不是单引号)将其引起来. 但是,让我们首先尝试在带下划线的表名周围设置引号.以下是一个例子-mysql> create  ...

  8. mysql 添加分区_创建,增加,删除mysql表分区

    1.测试添加分区和删除分区 ###添加删除range分区 (1)创建一个分区: CREATE TABLE titles ( emp_no      INT NOT NULL, title        ...

  9. 关于MySQL表添加某一列和删除某一列

    前言:MySQL是一种广泛使用的关系型数据库管理系统,它是一种开源的软件,由瑞典的MySQL AB公司开发的. 文章目录: 添加MySQL表中某一列 删除MySQL表中某一列 一.添加MySQL表中某 ...

最新文章

  1. 不要为了面子伤了自己
  2. autoLayout
  3. SHELL中的while与unil流程控制
  4. 如何写一篇酷炫的博文(博文列表中展现字幕)
  5. ASP.NET GridView嵌套DataList实例
  6. 红黑树中nil结点_什么是红黑树?程序员面试必问!
  7. ckeditor与ckfinder的使用方法 .NET (转载)
  8. web 流程图工具_要什么第三方流程图制作软件,微软的Visio 2016不香吗?
  9. 固态硬盘卡LOGO、掉固件、不认盘、无法高格等故障维修之SM2258XT量产篇
  10. 分享:一个轻量级的企业Wiki和团队知识分享平台CMS
  11. 2021正睿csp7连day1
  12. 计算机在信息处理中的作品用,计算机信息处理技术在办公自动化中的运用
  13. 六大基酒——朗姆酒的喝法
  14. 安防视频监控流媒体服务器系统对网络带宽的要求
  15. 2020年七普各城市人口年龄结构图
  16. java远控_利用Java实现远程控制
  17. DataStory X Kungfu | DemoDay亮点大揭秘
  18. 数据库第二次作业--表的约束
  19. ppt打印一页6张铺满不留白_你真的会做ppt?这些习惯和操作你有吗?
  20. HTML转义字符对照表(部分)

热门文章

  1. 关于华为x2中的外置SDCard的使用
  2. Mysql导入zabbix的sql语句时报错:ERROR 1045 (28000)
  3. 告诉你KVC的一切-b
  4. C# winform打印总结 z
  5. CentOS下Clonezilla通过网络自动备份还原系统
  6. Acdream Xor 简单数学
  7. apache属于哪个公司
  8. you may be a victim of software counterfeiting 的解药(亲自验证过方法2)
  9. CIDetector 相册识别二维码出错
  10. fps 每秒刷新的频率