数据库 ---- 表的约束

1. 表的约束

表的约束,表中一定要有各种约束,通过约束,让我们未来插入数据库中的数据是符合预期的,约束本质是通过技术手段,倒逼程序员,插入正确的数据,在mysql的视角,凡是插入进表的数据,都是符合数据约束的

约束的最终目标:保证数据的完整性和可预期性

1. 空属性

  1. 数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算

    如果班级没有名字,你不知道你在哪个班级
    如果教室名字可以为空,就不知道在哪上课


    一旦表中的某一列被设置了not null属性,那么这一列必须插入合法的数据

  2. 插入null:报错,设置了not null属性,就不能插入null

  3. 不能省略对设置了not null属性的列的插入,设置了not null属性,必须插入合法的数据,除非有默认值

可以看到设置了not null属性后,NULL变成了NO,不允许为空

这是mysql的做的优化

所以这里的报错是doesnot have default value,因为没有默认值

2. 默认值(default)



  1. default:如果设置了default,用户插入时有合法的数据,就用用户插入的,否则用的就是default,可以插入null

3. default 和 not null 一起用

  1. 如果我们没有明确哪一列要插入,用的是default默认值,如果建表中,对应列默认没有设置default,无法省略那一列的插入

  2. 为什么之前没有设置default,也没报错呢?
    因为mysqld默认加了default NULL,图里可以看到

  3. default 和not null不冲突是相互补充的

  4. not null:对于not null来说:
    用户插入时:NULL 或者合法数据(NULL报错)

  5. default:对于default来说:
    当用户忽略这一列的时候,使用默认值(如果设置了),如果没有设置,直接报错

所以前面的报错:doesnot have default value,因为没有默认值,所以报错

4. 列描述

comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员来进行了解,这样就降低了insert出错的概率

查表看不到,但是mysql的会加上,就是注释

5. zerofill


  1. centos7上会出现int(10)
    也可以写modify修改

对列添加了zerofill属性后,显示的结果就有所不同了

  1. 如果插入的数字 <() 里的数字,对高位补0
  2. 大于等于就是不变
  3. 本质还是1,就算补0了
  4. centos7里的(10),unsigned int是0~2的32次幂-1,差不多就是几十亿,10位数字能表示九十多亿,所以10位数字可以表示整数的数值位
  5. 如果是int 就是-2的32次幂~2的32次幂-1,有一位数值位,所以(11)

6. 主键

key中的pri表示该字段是主键

  1. 主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,
  2. 一张表中最多只能有一个主键,主键所在的列通常是整数类型

1. 追加主键

当表创建好以后但是没有主键的时候,可以再次追加主键,有了主键就不能追加了,一旦追加报错

c 复制代码
alter table 表名 add primary key(字段列表)

2. 删除主键

c 复制代码
alter table 表名 drop primary key;

主键只有一个无需加字段,直接删除

3. 复合主键

  1. 一张表只能有一个主键,但不意味着只能添加一列,一个主键可以被添加到一列或者多列,我们把这个主键叫复合主键

  2. 当表创建好以后,但是没有主键的时候,可以再次追加复合主键,
    有主键就不能追加了,一旦追加报错

  3. 创建表后,没有

两列共享这个主键,只有这两个属性完全一样,才报错,只要有一个为空就报错

4. 自增长






  1. 这里的自增长就是你可以忽略主键列的插入,也可以插入null,因为你不写id,默认插入id+1,相当于default,如果你显示写了id,以你写的id为准,然后下次默认插入的就是id+1,select last_insert_id(),查询的是最后一次插入id的值

  2. 任何一个字段要做自增长,前提是本身是一个主键

  3. 自增长字段必须是整数

  4. 一张表最多只能有一个自增长

5. 唯一键



可以插入null,不能重复,可以设置多列,每一个设置unique key的列,都不能重复,主键只有一个,复合主键是多列共享一个主键,只要多列不完全一样就行,而唯一键每一列都不能重复

6. 外键


外键本质是让从表和主表形成映射关系



外键:必须是主表的主键,作为从表的外键,一般是整数,而且必须加
foregin key(class_id) references class(id),否则只有关联,没有约束

比如,班级表里有1,2班,然后学生表里有学生在一班,此时你可以把一班的c语言班的班级表删除掉,但是不符合逻辑,学生表里学生在一班,而班级表却没有一班,或者在学生表里插入信息时,插入了一个班级表里,不存在的班,都是不符合逻辑的

可以插入null

相关推荐
克里斯蒂亚诺更新1 小时前
Android Studio创建一个新项目
android·ide·android studio
Elastic 中国社区官方博客1 小时前
使用 Elastic Observability 和 MCP 的 Agentic 驱动 Kubernetes 调查
数据库·elasticsearch·搜索引擎·云原生·容器·kubernetes·全文检索
阿正的梦工坊1 小时前
DOCKER_DATABASE_URL 逐段解析:部署时候的信息解析
数据库·docker·容器
AI玫瑰助手2 小时前
Python基础:列表的切片与嵌套列表使用技巧
android·开发语言·python
倒流时光三十年2 小时前
PostgreSQL 大表字段扩长度 -- 会不会锁表?
数据库·postgresql
Irene19912 小时前
(AI总结版)完整操作流程:从零配置 Oracle 21c XE 开发环境(安装 CO 示例、安装 SCOTT 教学示例)
数据库·oracle
Han.miracle2 小时前
Spring Cloud + Nacos 环境切换与配置管理最佳实践
数据库·spring boot·spring cloud·maven
p@nd@2 小时前
DM删除用户后的不完全恢复测试
数据库·达梦数据库·备份还原·备份恢复
在屏幕前出油2 小时前
08. ORM——快速开始
数据库·后端·python·sql·pycharm·orm