小知识,大挑战!本文正在参与「程序员必备小知识」创作活动
创建表
一个常规的表创建基本会具备以下元素:
- 主键
- 字符
- 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
约束强制关联