关于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 ...
随机推荐
- python Select\Poll\Epoll异步IO与事件驱动
参考:http://www.cnblogs.com/alex3714/articles/5248247.html 写服务器处理模型的程序时通常采用的模型: (1)每收到一个请求,创建一个新的进程,来处 ...
- figure设置坐标轴
import matplotlib.pyplot as plt import numpy as np x=np.linspace(-3,3,50) y1=x*2+1 y2=x**2 plt.plot( ...
- TableViewComponent v2
Unity UGUI 自带的 ScrollView 控件不支持复用滚动内容,在数量大的情况下,界面容易卡顿 借鉴其他游戏控件,写了个可复用的滚动组件,扩展.优化了ScrollView TableVie ...
- 查漏补缺:OSI七层模型和TCP/IP模型
应用层协议:Telnet.FTP.e-mail等 传输层协议:TCP.UDP.STCP等 网络层协议:IP.ICMP.IGMP等 链路层协议:设备驱动及接口卡
- git push的完整形式
现在的情况是,本地有两个分支:master.div, 远程仓库有一个分支:master,本地master分支和远程master分支建立有跟踪联系,这样本地master分支提交时直接git push(只 ...
- Java入门教程十(抽象类接口内部类匿名类)
抽象类(abstract) 一个类只定义了一个为所有子类共享的一般形式,至于细节则交给每一个子类去实现,这种类没有任何具体的实例,只具有一些抽象的概念,那么这样的类称为抽象类. 在面向对象领域,抽象类 ...
- Python列表倒序输出及其效率
Python列表倒序输出及其效率 方法一 使用Python内置函数reversed() for i in reversed(arr): pass reversed返回的是迭代器,所以不用担心内存问题. ...
- iOS开发线程同步技术-锁
概览 1,什么是锁(临界区)? 2,常用的锁有哪些? 3,相关链接 什么是锁(临界区) 临界区:指的是一块对公共资源进行访问的代码,并非一种机制或是算法. 常用的锁有哪些? 互斥锁:是一种用于多线程编 ...
- 从头认识js-基本概念(关键字,保留字,数据类型)
语法 ECMAScript的语法大量借鉴了C及其他类C语言(如Java和Perl)的语法.因此,熟悉这些语言的开发人员在接受ECMSAScript更加宽松的语法时,一定会有一种轻松自在的感觉. 区分大 ...
- CSS3:TEXT-SHADOW|BOX-SHADOW(炫彩字体)
2016年2月26日个人博客文章--迁移到segmentfault (1)text-shadow(文本阴影) 在介绍css3:text-shadow文本阴影之前,我们先来看看用它都能实现什么效果: 没 ...