当前位置: 代码网 > it编程>数据库>Mysql > Mysql中设计数据表的过程解析

Mysql中设计数据表的过程解析

2025年07月28日 Mysql 我要评论
1.引言数据库约束是确保数据完整性的关键机制,通过预定义的规则自动校验数据,避免人工检查的繁琐和潜在错误。约束作用于表的列上,确保数据的正确性和关联关系的有效性。以下是常见约束类型的详细说明及示例。2

1.引言

数据库约束是确保数据完整性的关键机制,通过预定义的规则自动校验数据,避免人工检查的繁琐和潜在错误。约束作用于表的列上,确保数据的正确性和关联关系的有效性。以下是常见约束类型的详细说明及示例。

2.not null——制定某列不可以存储null值

用于禁止某列存储空值(null),强制字段为必填项。

先来看看不加约束的学生表格所展示出来的信息:

desc student;

当没有指定非空约束的时候,当前的列表示是可以写入一个null的值的,如果要把某一列定义为一个必填项,那么就可以使用not null来进行约束。示例如下:

create table student(
    id bigint not null,
    name varchar(50)
);

 如图所示这个no就表示当前列(id列)不能为空 

下面我们插入一条为空的id数据试试:

insert into student values(null,'张三');

 写入这条数据的时候会报错,提示不可写入null的数值,这里数据库就帮我们进行了一次校验。

insert into student values(1,'张三');

当我们写入一条id列不为空的数据的时候,就可以正常写入这条数据

2.unique——保证某一列的每一行必须有唯一的数值

确保某列的数值在表中唯一,适用于如学号、身份证号等场景。
我们首先来看一下不加唯一约束的时候的情况:

可见这出现了编号相同但是人名不一致的情况,这种情况不符合逻辑。如何解决这一问题呢?
unique这一约束条件就应运而生了
下面我们来看一下如何创建一个在id字段加唯一约束的表:

create table student(
    id bigint unique,
    name varchar(50)
);

 由上图可见id的key有一个uni的标识,这就表示唯一约束
这时如果我们再插入两个一样的id数据就会报错,错误信息如下:

 需要注意的是null可以重复插入,并不会报错

3. default——规定没有给列赋值时的默认值

用于为列指定默认值,当插入数据未显式赋值时自动填充。

insert into student (id) values(2);

如果我们不指定name的默认值就会出现这样的情况,显然这种情况也是不合理的
下面我们就来创建一个给name列设置默认值的一个数据表

create table student(
  id bigint unique,
  name varchar(50) default '无名氏'
);

这个default无名氏就是我们指定的默认值
null列表示当前列是否可以为空
key表示数据行的键值(标识)
extra标识扩展信息 

下面我们来演示一下只指定了id会出现什么情况:

insert into student (id) values(2);

由此可见这时的name就用默认值进行填充了
下面我们来思考这样一个问题:如果我们给name列设置为null会出现什么情况呢?

insert into student values(3,null);

 由此可见,虽然我们已经指定了默认约束,但是当我们手动指定这一列的值为null的时候,插入的值依旧是null,因为这个nulll是我们自己手动指定的,也可以理解为:用户指定的优先级要高于默认约束。
于是我们可以得到这样一个结论:
当我们为某一列设置了默认约束的时候,如果不给这个列指定值才会使用默认约束。

4.primary key ——not null和unique的结合

确保某列(或者两个列多个列的结合)有唯一标识,有助于更容易快速找到表中的一个特定记录。

主键是 not null 和 unique的结合,用于唯一标识记录。

下面我们首先来演示一下如何把某一列的值约束为非空且唯一的:

create table student(
-- 下面这个就把id设置为了 不为空 并且唯一 注意: not null 和unique之间不能有, 直接空格就行
  id bigint not null unique,
  sn int unique,
  name varchar(50) default '无名氏'
);

由上图可见这个id的key列中被标识为了一个pri,表示他是一个主键
我们在写入数据的时候这两个约束是同时生效的:

create table student(
    id bigint primary key  auto_increment,
    sn int unique,
    name varchar(20) default '无名氏'
);

这个id列的extro的auto_increment表示自增类型,意为在当前表中上一条记录的基本上+1即可
这样设计的好处在于:让数据库去帮助我们维护主键的增长,不用自己去计算了,在插入数值的时候先找到最大的值,然后在这个基础上+1生成一个新的值,从而作为一个数据行主键(也就是id列)的值。

4.1全列插入演示

在写入数据的时候,我们不具体指定主键列的值,而是用null代替

insert into student values(null,1001,'张三');
insert into student values(null,1002,'李四');
select* from student;

由此可见:

当设置了自增主键之后,写入null的时候,也可以成功插入数据。这里并不是说把这个null写入数据库了,而是说数据库帮我们去处理这个列中的数值(进行自增操作

4.2指定列插入演示

insert into student(sn,name) values(1003,'王五'),(1004,'赵六');
select* from student;

由此可见当我们进行指定列插入的时候,也会自动生成id,作为该数据行的主键 。

下面我们思考这样一个问题:我们可不可以指定一个主键值呢?
时间是检验真理的唯一标准,接下来我们就手动指定来看看吧~

insert into student values(100,1010,'钱七');
select* from student;

由此可见这个操作是可以的,只要主键值不重复即可 

我们在这个基础之上再插入一条不指定id的数据试试,在这之前我们可以思考一下 这条新数据的id数值是多少呢?

insert into student(sn,name) values(1011,'王二');

由此可见这个id的值是在原先数据表中id的最大值的基础上加1,由此可见主键在数据表中有可能不是连续的

4.3一个表中不允许有两个主键

create table test111(
  id bigint primary key,
  sn bigint primary key
);

由上可见一个表中不可以同时设置两个主键,这样会报错。
但是一个主键可以同时包含多个列(复合主键)
下面我们就来演示一下复合主键:

create table stu1(
  id bigint,
  name varchar(20),
  mail varchar(50),
  primary key (id,name)
);
desc stu1;

由上图可知 id 和name的key都有pri 这就表示当前的表定义了复合主键,
复合主键在进行唯一校验的时候,只有复合主键中所有的列都相同才被判定为相同
下面我们通过例子来证实这一说法:

insert into stu1 values(1,'张三','zs.com');
select* from stu1;

下面我们再写入一条和这个一样的数据,看看会发生什么现象: 

insert into stu1 values(1,'张三','zs.com');

报错了,那就证明这条数据是不可以写入的,因为他和前面一条数据完全一致。

下面我们尝试一下id一样,name不一样是否可以成功写入呢?

insert into stu1 values(1,'李四','ls.com');
select* from stu1;

由此可见这条数据虽然id和前面张三的id一样,但是姓名不同,因此这条数据是可以插入成功的 

5.foreign key——保证一个表中的数据匹配另一个表中的值的参照完整性

用于维护表间的参照完整性,确保子表字段匹配主表的主键或唯一键。

我们先创建一个学生表和一个班级表,展示如下:

学生表的class_id一列的编号和班级表的id编号是具备对应关系的,但是此时我们并没有进行设置外键约束,这时我们在学生表中插入一条数据,并且这个数据的class_id是不在班级表中存在的。

insert into student(name,class_id) values('钱七',5);

由此可见这个操作是可以执行成功的,显然这个做法是不合理的,那么接下来我们引入:外键用于关联其他表的主键或唯一键
语法:foreign key(字段名) references 主表(列)

create table student(
  id bigint primary key auto_increment,
  name varchar(20) not null,
  class_id bigint,
  foreign key(class_id) references class(id)
);

foreign key表示创建外键的关键字 
class_id表示当前表中哪一个字段与主表建立主外键关系
references:关键字,表示后面要引入哪个表的那个列
class(id):指定主表和相应的列 

 这个mul就表示存在外键关系 
这时我们插入正确的班级编号是可以的:

此时再插入不存在的班级编号:

这样就不行了

5.1问题:当子表中存在对主表的依赖的时候,能不能删除主表中相应的记录?

我们以删除班级编号为4为例:

这会报一个主外键的错误。
下面我们先删除子表中依赖班级4的数据,再删除主表中班级为4的数据:

delete from student where class_id=4;
delete from class where id=4;
select*from class;

由此我们可以得出以下结论:
如果要删除主表中的记录,那么子表中的数据不能对该条记录有依赖
也就意味着先要删除子表中的记录,再去删除主表中的记录 

6.check-保证列中的值符合指定的条件

用于限制列值的范围,仅允许符合条件的数据。

create table test_check(
  id bigint,
  gender varchar(1),
  check(gender='男' or gender='女')
);

check为关键字
后面的gender表示要检查的列名=后面表示该列允许的值
下面我们执行这条语句:

insert into test_check values(1,'无');

 这样就报错了 因为‘无’并不在允许的值的范围之内。

总结

数据库约束通过自动化校验机制保障数据质量,减少人工干预的风险。合理使用 not nulluniqueprimary keyforeign key 和 check 约束,能有效提升数据一致性和业务逻辑的严谨性。

到此这篇关于mysql中设计数据表的过程解析的文章就介绍到这了,更多相关mysql数据表设计内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com