Mysql 温故知新系列 【表创建】

449 阅读2分钟

小知识,大挑战!本文正在参与「程序员必备小知识」创作活动

创建表

一个常规的表创建基本会具备以下元素:

  • 主键
  • 字符
  • boolean 标记
  • 时间
  • 外键
create table dept (
  id int unsigned auto_increment primary key,
  name varchar(20) not null
)
create table user (
    id int unsigned auto_increment primary key,
    uname varchar(20) not null,
    phone char(15) unique,
    create_time datetime default now(),
    active tinyint default 1,
    dept_id int,
    constraint fk_dept_id foreign key(dept_id) references dept(id)
)

字段解析

id

绝大多数人,都习惯将主键命名为 ID,针对主键,我们一般将将其声明为无符号 [unsigned] 且自增的 [auto_increment]需要强调一点,这种做法常用于单机环境,在分布式环境下,后台会取代 mysql 的主键自增功能,通过雪花算法生成唯一的id,再随着数据一起插入到 DB 库

定长文本

有时候,我们会定义一些字段,来存储电话号码,身份证号,员工编号,物料编码等等这些可以预料到长度的文本数据,强烈要求 使用 char 来定义类型

不定长文本

除去上面的场景,由于文本长度的不确定,建议使用 varchar(n) 定义类型,数据记录仅仅占用实际使用的空间(前提条件是长度还未超出声明时的长度)

还有一个衡量使用 varchar, char 的参数,就是预估字段存储的数据变更的频率,如果是高频率变更,使用 varchar 则会产生大量的碎片空间,这种情况下,我们考虑是空间换时间,亦或者是时间换空间,需要慎重考虑

此外,数据库支持存储二进制字符数据,但是,还是不建议用来存储视频、图片这类资源。最佳的操作是,在数据库中记录对应资源的 url,资源实际存储在磁盘上

字段限制

一般会限制字段是否允许为空,是否唯一,是否指定默认值

外键引用

在创建表直接指定表中的某个字段和另一个表的主键关联

如示例中,user 表中的 deptid 列关联上了 dept 表的主键 id

像上面这种处理,叫物理外键,由 mysql 提供保证,当 dept 的记录尝试删除是,需要 user 中没有记录引用对应的 dept 记录。

现在,没有特殊的要求,建议使用逻辑外键,即逻辑上是外键关联的,但数据库里并不使用 foreign 约束强制关联