一、空属性(null)

空属性有两个值,一种是null(默认值)和not null(不为空)
数据库的默认字段基本上都是字段为空,但是在实际开发时需要保证字段不为空,因为数据为空没办法参与运算
二、默认值(default)

默认值就是某种数据会经常性地出现某个具体的值,可以在一开始就制定好在需要真实数据的时候,用户可以选择性地使用默认值。
如果我们没有指定一列进行插入,使用的就是default,如果在建表时没有设置默认值default,则无法直接插入。或者我们可以为一个表添加默认值,添加方式如下:
sql
ALTER TABLE 表名 ALTER COLUMN 字段名 SET DEFAULT 默认值;
删除默认值:
sql
ALTER TABLE 表名 ALTER COLUMN 字段名 DROP DEFAULT;
三、列描述(comment)

在建表时可以在列属性后面添加对应的列描述comment,会根据表创建语句保存,用于给程序员了解列属性:

四、零填充约束(zerofill)
zerofill用于配合 int(M) 里的 M(显示宽度):,当查询展示时,如果数字位数不足 M 位,左边自动补前导 0。zerofill在前面的数据类型的博客中已经详细讲过,这里不再过多赘述。
使用示例如下:

补0后的效果如下

五、主键(primary key)
主键(primary key)用于唯一约束该字段里的数据,不能重复,不能为空,一张表中最多只能有一个主键,主键所在的列通常是整数类型。我们可以在创建表时就将需要约束的列属性后面带上primary key字段:

这里的添加主键有两种写法,一种就是直接在对应的列属性后带上主键字段;另一种是在建表的最后定义:

主键所在列的数据不能重复:

一个表中的主键是唯一的,但是并不代表一个表中的主键,只能添加给一列。一个主键也可以被添加到队列上。这种添加到多列上的主键我们称之为复合主键,示例如下:

除了在创建表的时候就设置主键约束以外,我们还可以为表的某一列添加主键约束:
sql
ALTER TABLE 表名 ADD PRIMARY KEY (字段名);
或者还可以这样修改某一列的属性时带上primary key字段:

删除某一列的主键约束:
sql
ALTER TABLE 表名 DROP PRIMARY KEY;
六、自增长(auto_increment)
我们可以为某一列设置自增长属性,设置了自增属性的列,如果插入数据时不给该列赋值,它会读取自增计数器里记录的值,自动 + 1 后存入表中。要注意的是,只有主键或者唯一键的列才可以设置自增长,否则会报错。

这种自增长还有一个特性:插入数据的时候,如果我们手动填入的值大于当前自增计数器的值,自增计数器就会跟着动态更新,下一次自动插入的值,就会从这次手动插入的数值 + 1 开始。
七、唯一键(unique key)
和主键一样,唯一键也可以在建表时就设置好,也可以后续再添加。但是与主键不同的是,唯一键可以有很多个,但是主键一个表中只能有一个。

为某一列属性添加唯一键约束:
sql
ALTER TABLE 表名 ADD UNIQUE 约束名(字段名);

删除某一列的唯一键约束:
sql
ALTER TABLE 表名 DROP INDEX 约束名;

后续要讲的普通索引的删除方式和唯一约束的删除方式是一致的。
八、外键
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或 unique 约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
语法:
sql
foreign key (字段名) references 主表(列)
使用示例:

外键的存在能够保证两张关联表之间的数据引用合法性,防止出现 "脏数据",能够保证数据的完整性。举刚才的例子:class(班级主表)、student(学生从表),学生表的cid是外键,关联班级表主键cid。如果没有外键,我们可以给学生随便填一个 cid=999,但是班级表里根本没有 999 这个班,此时数据就错乱了;如果有外键,数据库会强制校验,不允许插入主表不存在的编号,避免这种情况发生。
添加外键约束
sql
ALTER TABLE 表名
ADD CONSTRAINT 约束名
FOREIGN KEY (本表字段) REFERENCES 主表(主表字段);
删除外键约束:
sql
ALTER TABLE 表名 DROP FOREIGN KEY 约束名;
需要注意的是,如果直接删除主表,因为存在关联的从表,MySQL 会直接报错。

删除 / 更新行为(ON DELETE / ON UPDATE):
sql
FOREIGN KEY (cid) REFERENCES class(cid)
ON DELETE CASCADE -- 级联删除:主表删了,从表跟着删
ON UPDATE SET NULL; -- 主表更新,从表外键置空
外键的优缺点
优点:
1.数据库层面自动维护关联关系,不用自己写代码判断;
2.多人开发、程序有 bug 的时候,兜底防止无效数据。
缺点
1.性能差:增删改的时候数据库要额外校验;
2.容易锁表;
3.很多企业项目(后端开发)业务上不用外键,把关联校验放到代码里做,放弃数据库外键。