MySQL表的约束

一、空属性(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.很多企业项目(后端开发)业务上不用外键,把关联校验放到代码里做,放弃数据库外键。

相关推荐
时间售卖铺1 小时前
MySQL存储过程流程控制全解析
运维·数据库·mysql·云原生
拾起零碎1 小时前
U8/触发器,把自定义项写入批次档案
数据库
IT19959 小时前
Fail2Ban 防护 MySQL 实战|登录失败 3 次,IP 封禁 24 小时
数据库·mysql
夕除9 小时前
redis--IO 多路复用(select + poll)
数据库·sql
paopaokaka_luck12 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
lzhdim13 小时前
100条常用SQL语句
数据库·sql·mysql·mybatis
天河归来13 小时前
从原始消息到业务数据:三层数据架构的设计与实践
数据库·数据仓库·架构
数据库小学妹14 小时前
金融数据库成本怎么算?五笔钱加一张TCO表
数据库·金融行业·数据库选型·国产化替代·tco·金融数据库
KaiwuDB14 小时前
KaiwuDB 分布式集群扩缩容,从原理到完整操作踩坑总结
运维·数据库·分布式