由于在生产环境下,我们对MySQL数据库的操作通常是通过命令行进行操作,因此,建议建表的时候也手写MySQL语句(不建议用图形界面建表)。

1、添加注释的格式

在编写MySQL语句时,我们通常会被要求加上注释,推荐的注释格式为:

  1. -------------------------------------------------
  2. -- 创建表 tb_example 创建示例表
  3. -------------------------------------------------
  4. create table tb_example(
  5. ….
  6. )…

理由:这种注释格式MySQL解析器也会认为是注释的,然后,会正确执行你的create table相关语句。我们通常将要更改的sql语句整理到一个1.0.0.sql文件中,然后,你只需要登录MySQL客户端,输入:source /文件目录/1.0.0.sql。因此,这样的注释可以达到一举两得的目的。

2、指定表的引擎和缺省的编码格式以及该表的说明

示例语句如下:

  1. create table tb_example(
  2. ….
  3. )engine=innodb default charset=utf8 comment ‘这是一张示例表’;

理由:上述显示的指定使用的引擎为innodb,在5.6之前默认的引擎是MyISAM,而现在主流推荐性能较好的是innodb,具体参考:高性能MySQL 这本书。上述也指定了缺省字符集为utf8,还有不要漏掉使用comment来注释下这张表的用途,便于其他开发人员了解这张表的意图。

3、一个经典的建表语句示例并分析

示例语句如下:

  1. create table tb_example(
  2. id int unsigned not null auto_increment comment '主键id',
  3. app_id int unsigned not null default '0' comment '应用id',
  4. app_name varchar(255) not null default '' comment '应用名',
  5. click_cnt int unsigned not null default '0' comment '点击数',
  6. disp_cnt int unsigned not null default '0' comment '展示数',
  7. status tinyint unsigned not null default '0' comment '状态: 1-启用;0-禁用',
  8. click_rate float unsigned not null default '0' comment '点击率=点击数/展示数',
  9. note text not null default '' comment '备注',
  10. date varchar(255) not null default '统计日期',
  11. mtime int unsigned not null comment '修改时间',
  12. ctime int unsigned not null comment '创建时间',
  13. primary key ("id"),
  14. unique key unique_date_appid ("date","app_id"),
  15. key idx_date ("date"),
  16. key idx_ctime ("ctime")
  17. )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日期格式

示例如下:

  1. 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);
  2. 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组合,则会报联合索引重复错误,比如,再次执行:

  1. 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语句改为:

  1. 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 建表的一些建议的更多相关文章

  1. 基于表的数据字典构造MySQL建表语句

    表的数据字典格式如下: 如果手动写MySQL建表语句,确认麻烦,还不能保证书写一定正确. 写了个Perl脚本,可快速构造MySQL脚本语句. 脚本如下: #!/usr/bin/perl use str ...

  2. mysql建表出现Timestamp错误

    mysql建表时如果有两个或以上的字段为Timestamp,那么可能会出现如下错误: Incorrect table definition; there can be only one TIMESTA ...

  3. MySql 建表出现的问题:[ERR] 1064 - You have an error in your SQL syntax; check the manual.......

    使用 MySql 建表出现的问题 在使用 Navicat Premium 运行 sql 语句进行建表时,MySQL 报错如下: 建表语句: DROP DATABASE IF EXISTS javawe ...

  4. MySQL 建表语句 create table 中的列定义

    MySQL 建表语句 create table 中的列定义: column_definition: data_type [NOT NULL | NULL] [DEFAULT default_value ...

  5. 三种常用的MySQL建表语句

    MySQL建表语句是最基础的SQL语句之一,下面就为您介绍最常用的三种MySQL建表语句,如果您对MySQL建表语句方面感兴趣的话,不妨一看. 1.最简单的: CREATE TABLE t1(    ...

  6. 【转载】mysql建表date类型不能设置默认值

    如题,mysql建表date类型的不能设置一个默认值,比如我这样: CREATE TABLE `new_table` ( `biryhday` datetime NULL DEFAULT '1996- ...

  7. Mysql建表通用写法

    Mysql建表通用写法 CREATE TABLE IF NOT EXISTS stu( id ) PRIMARY KEY AUTO_INCREMENT,//主键 自增 stuname ) NOT NU ...

  8. 【记录】Mysql 建表注意事项

    博主最近打算搭建商城,由于之前对建表只有很浅显的理解,没有太过深入了解,建表过程中遇到一些问题,现记录如下, 如有问题请各位留言指正,感激不尽: 建表时设置如何设置联合主键?如下标红处: CREATE ...

  9. MySQL建表DDL规范(欢迎补充)

    MySQL建表DDL规范(欢迎补充) 基本规范: 表名和字段名全大写,一般表名以T开头 脚本需支持可重复执行,带IF NOT EXISTS ,但不可带DROP语句 字符集使用utf8mb4 (CHAR ...

随机推荐

  1. <pre>标签的使用

    做做笔记.碰见了一个网站,显示代码的时候自带语法高亮,这很新鲜.它的代码被pre标签包裹,原本以为pre标签下的所有的内容会以文本原来的样式输出,特意查了查发现它依然支持html标签. 先来个菜鸟教程 ...

  2. 20190407-ORID

    2019-04-07 Objective 关于今天的课程,你记得什么? 给代码建立分支的操作 完成了什么? 完成了rails101前6节 Relective 今天的高峰是什么? 成功完成rails10 ...

  3. 用 Python 读写 Excel 表格

    Python 可以读写 Excel 表格吗? 当然可以. Python 下有很多类库可以做到, openpyxl 就是其中的佼佼者. openpyxl 的设计非常漂亮 ,你一定会喜欢它!不信请往下看: ...

  4. Web 通信技术 ——跨文档信息传输(JavaScript)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.html * 作者:常轩 * 微信公众号:Worldh ...

  5. css雪碧图压缩

    cssgaga下载地址 链接: https://pan.baidu.com/s/1Q9xH_XzumIc7vTLCZ3tr5A 提取码: stqe CssGaga功能特性 合并import的CSS文件 ...

  6. Failed to open the key database file. c;\\User\\w\\Destop\\SecureCRT_FX6.5.3\\Config\\KnowHosts\\Hostsmap.txt这个问题的解决方法

    1.首先将这段错误在百度翻译上面查询一下,是什么意思,查询结果如下: 打开密钥数据库文件失败.C:\用户\ w \平台\ securecrt_fx6.5.3 \\ \\ \\ hostsmap.txt ...

  7. 基于Vue的机器学习平台前端

    项目演示地址:http://vidanao.com/ml>注意1:前端兼容性不太好,360浏览器比较兼容; >注意2:此vidanao.com也是我的个人博文主页,但目前还没部署 源码地址 ...

  8. [LeetCode] 994. Rotting Oranges 腐烂的橘子

    题目: 思路: 每个腐烂的橘子都能将自己上下左右的新鲜橘子传染,像极了现在的肺炎... 如果格子中只有一个腐烂的橘子,那么这便是一个典型的层次遍历,第一个传染多个,称为第二层,第二层传染第三层 但这里 ...

  9. 复习笔记——1. C语言基础知识回顾

    1. 数据类型 1.1 基本数据类型 整型:int, long,unsigned int,unsigned long,long long-- 字符型:char 浮点型:float, double-- ...

  10. 一起了解 .Net Foundation 项目 No.18

    .Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. Protobuild Pr ...