关于MySQL 建表的一些建议
由于在生产环境下,我们对MySQL数据库的操作通常是通过命令行进行操作,因此,建议建表的时候也手写MySQL语句(不建议用图形界面建表)。
1、添加注释的格式
在编写MySQL语句时,我们通常会被要求加上注释,推荐的注释格式为:
- -------------------------------------------------
- -- 创建表 tb_example 创建示例表
- -------------------------------------------------
- create table tb_example(
- ….
- )…
理由:这种注释格式MySQL解析器也会认为是注释的,然后,会正确执行你的create table相关语句。我们通常将要更改的sql语句整理到一个1.0.0.sql文件中,然后,你只需要登录MySQL客户端,输入:source /文件目录/1.0.0.sql。因此,这样的注释可以达到一举两得的目的。
2、指定表的引擎和缺省的编码格式以及该表的说明
示例语句如下:
- create table tb_example(
- ….
- )engine=innodb default charset=utf8 comment ‘这是一张示例表’;
理由:上述显示的指定使用的引擎为innodb,在5.6之前默认的引擎是MyISAM,而现在主流推荐性能较好的是innodb,具体参考:高性能MySQL 这本书。上述也指定了缺省字符集为utf8,还有不要漏掉使用comment来注释下这张表的用途,便于其他开发人员了解这张表的意图。
3、一个经典的建表语句示例并分析
示例语句如下:
- create table tb_example(
- id int unsigned not null auto_increment comment '主键id',
- app_id int unsigned not null default '0' comment '应用id',
- app_name varchar(255) not null default '' comment '应用名',
- click_cnt int unsigned not null default '0' comment '点击数',
- disp_cnt int unsigned not null default '0' comment '展示数',
- status tinyint unsigned not null default '0' comment '状态: 1-启用;0-禁用',
- click_rate float unsigned not null default '0' comment '点击率=点击数/展示数',
- note text not null default '' comment '备注',
- date varchar(255) not null default '统计日期',
- mtime int unsigned not null comment '修改时间',
- ctime int unsigned not null comment '创建时间',
- primary key ("id"),
- unique key unique_date_appid ("date","app_id"),
- key idx_date ("date"),
- key idx_ctime ("ctime")
- )engine=innodb default charset=utf8 comment '这是一张示例表';
需要注意的点如下:
1)所有的字段要加commet注释
由于我们创建的表也可能被其他人所用,因此加上comment注释,其他人或者我们自己可以通过命令show create tabletb_example来查看表的结果信息。
2)、int 符号确定
如果确定整形为非负数,就将int设置为无符号型的,即int unsigned,可以多一半的值范围,又能避免插入负数。int设置为无符号的场景在很多场合都使用。
3)、不定长varchar的长度设置
对于不定长字符串varchar如果不确定字符串长度(且知道字符串长度小于255)可以设置为vachar(255),此时,存储空间只比正常的多一个字节(与设置varcahr(10)额外存储的空间是一样的),又能够最大限度的利用varchar的特定。注意:超过255则用于存储该长度的空间会多于一个字节。具体参考:高性能MySQL。
4)、有限状态的类型设置
对于表示状态数值的数据类型建议设置为tinyint unsigned(只占用一个字节的空间) 可以表示0到255的范围。注意:无需用int,占用四个字节的空间。
5)字段创建时间ctime和修改时间mtime
每个表中尽量加上字段创建时间ctime和字段修改时间mtime,便于后期排查问题,知道该条记录是何时插入,何时修改。
6)、日期时间设置为int时的查询
这里的ctime表示创建时间,用的是unix时间戳来存储,但是不能设置缺省值unix_timestamp(),我们在实际查询的时候,可以使用from_unixtime(ctime)来将unix时间戳转为date日期格式。
示例如下:
- insert into tb_example(app_id, app_name, click_cnt, disp_cnt, status, click_rate, note, date, mtime, ctime) values (1, 'timApp', 12, 6, 1, 0.50, '这是备注', '20170815', 1502796713, 1502796713);
- select *, FROM_UNIXTIME(mtime), FROM_UNIXTIME(ctime) from tb_example;
效果如下:
7)所有的字段尽量设置为not null。
8)尽可能的设置default的值
比如:app_name 中通过设置default ‘’,click_cnt设置default ‘0’。
9)将有可能要进行查询的字段设置为索引
比如:key idx_date(“date”),这里因为可能会查询一段时间内的数据,因此添加字段“date”的索引。注意:一般索引的命名规则是idx_字段名
10)设置唯一索引
根据业务确定哪些字段或者字段组合的值是唯一的,则将该字段或字段组合设置为唯一索引。
比如:unique keyunique_date_appid(“date”, “app_id”) 这里因为根据业务我们只要对于具体的某一天具体的某个应用的记录一定只能有一条,因此,设置联合唯一索引可以防止改天对应的该应用的数据重复插入。注意:唯一索引的命名规则为:unique_字段1_字段2。
一个小知识点:
由于我们添加了唯一索引unique_date_appid,如果插入重复的date 和 app_id组合,则会报联合索引重复错误,比如,再次执行:
- insert into tb_example(app_id, app_name, click_cnt, disp_cnt, status, click_rate, note, date, mtime, ctime) values (1, 'timApp', 12, 6, 1, 0.50, '这是备注', '20170815', 1502796713, 1502796713);
提示:
但是,我们在很多场景时,不希望执行SQL语句报错,而是提示重复插入,此时,可以利用insert ignore into语句,将上述SQL语句改为:
- insert ignore into tb_example(app_id, app_name, click_cnt, disp_cnt, status, click_rate, note, date, mtime, ctime) values (1, 'timApp', 12, 6, 1, 0.50, '这是备注', '20170815', 1502796713, 1502796713);
提示:
我们可以通过返回结果result进行判断,如果result为0,则表示重复插入。
关于MySQL 建表的一些建议的更多相关文章
- 基于表的数据字典构造MySQL建表语句
表的数据字典格式如下: 如果手动写MySQL建表语句,确认麻烦,还不能保证书写一定正确. 写了个Perl脚本,可快速构造MySQL脚本语句. 脚本如下: #!/usr/bin/perl use str ...
- mysql建表出现Timestamp错误
mysql建表时如果有两个或以上的字段为Timestamp,那么可能会出现如下错误: Incorrect table definition; there can be only one TIMESTA ...
- MySql 建表出现的问题:[ERR] 1064 - You have an error in your SQL syntax; check the manual.......
使用 MySql 建表出现的问题 在使用 Navicat Premium 运行 sql 语句进行建表时,MySQL 报错如下: 建表语句: DROP DATABASE IF EXISTS javawe ...
- MySQL 建表语句 create table 中的列定义
MySQL 建表语句 create table 中的列定义: column_definition: data_type [NOT NULL | NULL] [DEFAULT default_value ...
- 三种常用的MySQL建表语句
MySQL建表语句是最基础的SQL语句之一,下面就为您介绍最常用的三种MySQL建表语句,如果您对MySQL建表语句方面感兴趣的话,不妨一看. 1.最简单的: CREATE TABLE t1( ...
- 【转载】mysql建表date类型不能设置默认值
如题,mysql建表date类型的不能设置一个默认值,比如我这样: CREATE TABLE `new_table` ( `biryhday` datetime NULL DEFAULT '1996- ...
- Mysql建表通用写法
Mysql建表通用写法 CREATE TABLE IF NOT EXISTS stu( id ) PRIMARY KEY AUTO_INCREMENT,//主键 自增 stuname ) NOT NU ...
- 【记录】Mysql 建表注意事项
博主最近打算搭建商城,由于之前对建表只有很浅显的理解,没有太过深入了解,建表过程中遇到一些问题,现记录如下, 如有问题请各位留言指正,感激不尽: 建表时设置如何设置联合主键?如下标红处: CREATE ...
- MySQL建表DDL规范(欢迎补充)
MySQL建表DDL规范(欢迎补充) 基本规范: 表名和字段名全大写,一般表名以T开头 脚本需支持可重复执行,带IF NOT EXISTS ,但不可带DROP语句 字符集使用utf8mb4 (CHAR ...
随机推荐
- 添砖加瓦:MySQL分布式部署
1.集群环境 管理节点(MGM):这类节点的作用是管理MySQLCluster内的其他节点,如提供配置数据,并停止节点,运行备份等.由于这类节点负责管理其他节点的配置,应该在启动其他节点之前启动这类 ...
- concurrent包分析之Executor框架
文章目录 线程生命周期的开销:线程比较少的情况使用new Thread(task)无多大影响,但是如果涉及到线程比较多的情况,应用的性能就会受到影响,如果jdbc创建连接一样,new Thead创建线 ...
- 如何正确的hook方法objc_msgSend · jmpews
如何正确的hook方法objc_msgSend 前言 如果希望对 Objective-C 的方法调用进行 log, 一个很好的解决方法就是 hook 方法 objc_msgSend, 当然想到的就是利 ...
- Circles of Waiting
题目传送门 很容易列出期望的方程,高斯消元搞一波但是常规消元复杂度是$O(r^6)$的考虑从左到右从上到下编号然后按编号从小到大消元假设黄点是已经消元的点,那么消下一个点的时候,只有绿点的方程中该项系 ...
- 亚马逊,谷歌,Facebook,IBM和微软:为了AI,是的,我们在一起了
美国时间9月28日,也就是几个小时前,亚马逊,谷歌,Facebook,IBM和微软宣布成立了一家非盈利组织:人工智能合作组织(Partnership on AI),目标是为人工智能的研究制定和提供范例 ...
- Java工作流引擎结合可视化表单开发,10分钟完成一个业务流程发布
回忆以前工作流引擎的应用,感觉历历在目啊!当初公司接了一个项目关于政府单位公文流转的管理系统,一开始客户跟我画了十多张业务流程图.话说这十多张业务流程图,涉及的业务范围还蛮多,像用审批授权,开通流程, ...
- 从0开发3D引擎(十一):使用领域驱动设计,从最小3D程序中提炼引擎(第二部分)
目录 上一篇博文 本文流程 回顾上文 解释基本的操作 开始实现 准备 建立代码的文件夹结构,约定模块文件的命名规则 模块文件的命名原则 一级和二级文件夹 api_layer的文件夹 applicati ...
- A01 React+Antdesign 开发环境准备
B站教程视频 https://www.bilibili.com/video/av38372336?from=search&seid=1131449710389099812 1 安装node.j ...
- UBB代码
UBB代码是HTML(标准通用标记语言下的一个应用)的一个变种,是Ultimate Bulletin Board (国外的一个BBS程序)采用的一种特殊的TAG.您也许已经对它很熟悉了.UBB代码很简 ...
- direction和writing-mode的介绍
direction介绍 属性值和兼容都很好 CSSdirection属性简单好记,属性值少,兼容性好,关键时候省心省力,是时候给大家宣传宣传,不要埋没了人家的特殊技能. Chrome Safari F ...