概念
表的约束保证插入的数据是合法的, 符合预期的;
真正约束字段的是数据类型, 但关于单一, 所以需要一些额外的约束, 满足不同的场景;
1. 空属性
-
MySQL 中, 空属性有两个值, null 和 not null;
-
与 C/C++ 中的空值不同, MySQL 中的空值无法参与运算;
-
数据库默认字段基本都是可为空, 但实际使用中, 尽可能保证字段不为空;
例:
创建一个可为空的字段和不可为空的字段;
向其插入数据, 不可为空的字段中是不能插入空值的;
2. 默认值
- MySQL 中, 字段的默认值 默认为空值;
- 当字段不可为空时, 若默认值为空值, 那么需要显示插入数据;
例:
新增字段 num3 , 默认值为 3;
向表中插入数据时, 不可为空且默认值为空的字段是不能被忽略的;
3. 列描述
- comment, 列描述, 没有实际的含义, 专门用来描述字段, 类似注释, 会根据表创建语句保存;
例:
desc 是不显示列描述信息的, 会在表创建的详细信息中显示;
4. zerofill
- zerofill 零填充, 若当前值的宽度小于该字段定义时的宽度(包括符号位), 会将自动填充前导零, 使其与定义中指定的显示宽度相匹配, 类似一种格式化输出;
例:
新增字段 num4, 设置 zerofill 约束, 需要注意, 使用 zerofill 会默认添加无符号属性;
而 int(10) 中的 (10) 表示的是前导零填充至的位数, 与类型的存储大小无关;
将 num4 的前导零长度减少, 方便观察, 然后向表中插入数据;
5. 主键
- primary key 主键, 是用来约束唯一数据的;
- 主键不能重复, 不能为空, 一张表中只能有一个主键, 通常是整数类型;
例:
新增字段 num5, 设置为主键;
向表中插入数据, 主键的数据是不能重复, 为空的;
可以指定删除表的主键
ALTER TABLE table_name DROP PRIMARY KEY;
也可以为已经插入数据的表创建主键, 但只有字值不为空且不重复的字段才能被设置为主键;
ALTER TABLE table_name ADD PRIMARY KEY(column)
6. 自增长
- auto_increment 自增长, 设置自增长的字段, 若插入数据时未显示设置, 会被系统自动触发, 将当前字段中已有的最大值, 进行 +1 操作, 设置; 通常和主键配合使用, 作为逻辑主键;
- 自增长字段类型必须为整型, 并且本身必须为一个索引, 一张表最多只能有一个自增长字段;
例:
修改字段 num5 , 设置主键和自增长属性;
向表中插入数据, auto_increment 会根据在该字段中记录的最大值进行操作;
7. 唯一键
- unique 唯一键, 是多个字段用来约束唯一性的;
- 和主键不同, 唯一键可以存在多个, 并且允许为空, 但空字段不做唯一性比较, 主键和唯一键不冲突, 相互补充;
- 每个唯一键字段都不允许出现重复的值 ;
例:
修改 num1, num2, num3, num4 字段, 添加唯一键;
向表中插入数据, 每个字段新插入的数据都不能与当前字段存在的值重复;
8. 外键
- 外键用于定义主表和从表之间的关系;
- 外键的约束主要定义在从表上, 主表则必须是有主键约束或唯一键约束字段的;
- 当定义外键后, 要求外键字段的数据必须在主表的字段中存在或为 null;
例:
为 t1 表的 num5 字段插入数据, 并创建 t2 表, 建立从属关系, 设置 num5 为主键字段, num6 为外键字段;
向 t2 表中插入数据, 只能插入主键字段中存在的值;
也可以使用语句创建,
ALTER TABLE 从表名 ADD CONSTRAINT 约束名 FOREIGN KEY (外键字段) REFERENCES 主表名(主键字段);
删除外键;
ALTER TABLE 从表名 ADD CONSTRAINT 约束名 FOREIGN KEY (外键字段) REFERENCES 主表名(主键字段) ON DELETE CASCADE;