Mysql Example

table example

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE `table_name` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(254) DEFAULT '',
`chips` bigint unsigned NOT NULL,
`status` tinyint unsigned NOT NULL,
`time` int(10) unsigned NOT NULL,
`created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
PRIMARY KEY (`id`),
UNIQUE KEY `uni_name` (`name`),
KEY `idx_time` (`time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  • 每张表都有主键 id

  • 所有 int 确定非负数都使用 unsigned 避免浪费范围

  • varchar(255) 不是 256, 方便 InnoDB 建索引, 少申请一个字节

  • linux 时间戳使用 int(11) unsigned, 因为已经达到目前 linux 标准范围, 超出部分现有大部分语言时间戳函数无法识别

  • 习惯使用 created_time, updated_time 字段, 默认是让 mysql 自动记录时间

  • 索引命名例子, uni_xxx 表示 unique key, idx_xxx 表示普通索引, 默认 btree, 非 hash 索引不用写上定义

  • tinyint 一个字节 smallint 两个字节 MEDIUMINT 三个字节, 状态字段一般 tinyint unsigned (0-255)

  • 非特殊用途, 一律 NOT NULL, varchar default ‘’ 而不是 NULL, ‘’不占用字节, NULL 占用字节

  • 使用下划线命名, 而不是驼峰, mysql 内部默认大小写不敏感

关于 int 类型

  • 定义
类型 存储 容量 范围 unsigned 展示位
tinyint 1 Byte 2^8 -128 ~ 127 0 ~ 255 3
smallint 2 Byte 2^16 - 0 ~ 65535 5
mediumint 3 Byte 2^24 - 0 ~ 16,777,215 (1600 万+) 8
int 4 Byte 2^32 -2147483648 ~ 2147483647 0 ~ 4,294,967,295 (42 亿+) 10
bigint 8 Byte 2^64 - 0 ~ 18446744073709551615 20
  • int(M) M 为展示位数, 与实际存储容量无关, 对应类型存储的最大值和最小值是固定的

  • 因为符号位存在, 一般 int(11) 和 unsigned int(10)

  • 不设置 fillzero 补零, unsigned 的 int(11) 与 int(10) 无区别, 一般设置为 int(11) 预留可转换符号