关于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 ...
随机推荐
- css 控制li点与文字的距离
ul>li 默认的样式如下 前面的点与文字是有间距的 可见,通过设置 text-indent 属性可以调整li点与文字的距离
- 算法基本概念及常用算法Python实现
基础算法概念: 时间复杂度 时间复杂度是从其增速的角度度量的, 时间复杂度一般用大O法表示. 递归 递归指的是调用自己的函数. 如果使用循环,程序性能可能更高: 如果使用递归,程序可能更容易理解. ...
- Autotestplat.com 更新了!
1 提供测试发帖留言功能 2 自动化平台体验功能 3 提供招聘资讯功能 4 提供推荐书籍功能
- js之构造函数的理解
在JavaScript中,创建对象的方式包括两种:对象字面量和使用new表达式.对象字面量是一种灵活方便的书写方式,例如: 1 2 3 4 5 6 var o1 = { p:”I’m in ...
- LeetCode 题解 | 237. 删除链表中的节点
题目描述: 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = [4,5,1,9],它可以表示为: 示例 1: 输入: hea ...
- 【Art】物理课题——虹吸
前言(无关闲话):在此之前,课题小组讨论了三.四次,得有10个小时了总共,但是具体还是在普及常识,那就在这里深入地讲一下. 进入正题—— 这就是虹吸的基本模型,再看一下百度的官方说法: “虹吸(sip ...
- Fedora CoreOS 非LInux专业安装文章第一手
开篇一张图 Docker基本知识掌握后,又学习了"专有的系统平台",CoreOS; 之前一直Windows,学习Docker的同时练习了好多Linux知识,全是江湖路数,打个不同就 ...
- eslint webpack2 vue-loader配置
eslint是一个代码检测工具 官网如下http://eslint.cn/ npm install eslint --save-dev 需要这几个npm包: eslint eslint-loader ...
- 前端每日实战:17# 视频演示如何用纯 CSS 创作炫酷的同心矩形旋转动画
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/bMvbRp 可交互视频教程 此视频 ...
- JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林 (Standard IO)
5286. [NOIP2017提高A组模拟8.16]花花的森林 (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Descript ...