1、 建立数据库
建立数据库建议指定编码为UTF-8,并且建议修改数据库的默认编码为utf-8
# 新建数据库,并设置编码格式
create database 数据库名 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
修改数据编码参考网址:tech.souyunku.com/liyingxiang…
需要注意的是,修改完文件一定要停止再启动mysql服务(不是指exit mysql)。
2、 建表
大公司建表都需要经过严格DBA平台发单上线,所以一般还是需要通过脚本来建表,而且脚本可以方便保存和复用,尤其是在表特别多时,手工建表难以想象,这时候脚本就显得尤其重要。
2.1 建表脚本示例
DROP TABLE IF EXISTS `User`;
CREATE TABLE `User` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '记录ID',
`userId` varchar(40) NOT NULL COMMENT '用户ID',
`userName` varchar(20) NOT NULL DEFAULT '' COMMENT '用户名',
`status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '用户状态',
`createTime` timestamp NOT NULL DEFAULT '2010-01-01 00:00:00' COMMENT '创建时间',
`updateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_userid` (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '用户表';
显示建表脚本:
SHOW CREATE TABLE tbl_name;
2.2 脚本建表建议
参考网址:
https://blog.csdn.net/timchen525/article/details/77200087
对于脚本建表,有如下几点建议:
2.2.1 表名、列名、字段名均使用反引号`表示,注释使用单引号’表示
2.2.2 指定表的引擎、编码,并声明注释
# 引擎
ENGINE=innodb
# 默认字符集
DEFAULT CHARSET=utf8
# 注释
COMMENT '表注释'
2.1.3 字段
(1)所有字段都不可以为null
主要原因:
- 容易导致业务代码中出现NullPointerException等异常
- timestamp类型下NULL中容易出问题
- null值在使用 !=、not in等负向条件查询时会被忽略,造成结果不准确
可参考
https://my.oschina.net/leejun2005/blog/1342985
(2)尽量都设置默认值
(3)所有字段都需要注释
(4)数据库ID与业务ID分开
数据库ID应该使用自增字段,业务ID如果需要可以使用唯一性约束。
(5)自增字段建议使用bigint类型
bigint对应java long型数据范围,int对应java int类型数据范围
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '记录id',
(6)取值很少的状态status、类型type等字段推荐使用tinytint类型
如果某个字段用来区分状态和类型,比如Java中使用枚举类型,那么数据库可以使用对应的枚举编号。tinyint类型占用一个字节。
(7)布尔类型使用tinyint类型表示
布尔类型对应mysql中tinyint类型
(8)活跃的表中必须有创建时间字段create_time和更新时间字段update_time
`createTime` timestamp NOT NULL DEFAULT '2010-01-01 00:00:00' COMMENT '创建时间',
`lastUpdateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
2.1.4 索引
(1)必须使用自增的单列字段作主键(针对InnoDB引擎),主键可以不命名,命名的话建议遵照:pk_表名_字段名
InnoDB引擎每个表都会有聚集索引,默认采用主键作为聚集索引;如果不存在主键,那么使用第一个不允许为null的唯一性索引作聚集索引;否则会创建一个隐藏的row-id列作为聚集索引。
- 聚集索引的概念:键值的逻辑顺序决定了表中相应行数据在物理磁盘的顺序。使用聚集索引查询效率比非聚集索引要高。聚集索引适合排序和范围查找。
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '记录id',
PRIMARY KEY (`id`),
参考网址:
https://zhuanlan.zhihu.com/p/39293940
https://www.imooc.com/article/22915
https://tech.souyunku.com6844903875284041741
https://tech.souyunku.com6844903645125820424#heading-7
(2)对业务主键使用唯一性约束,并且要设置约束名,命名建议遵照规则:uk_表名_字段名
UNIQUE KEY `uk_app_appId` (`appId`)