首先表的约束是什么?

表的约束就是未来在插入数据库中的表中的数据是符合预期的。当我们在向表中插入数据时,如果我们插入的数据和表中的类型不相符,那么数据库就会约束我们提醒我们插入正确的数据。

约束的最终目标就是保存数据的完整正确性和符合要求。

为了更好的使用表我们需要更多的约束条件。

一.空属性(Null属性)

之前我们在desc table查看表的时候会看到表后面有这样几组数据

那么这些就是表的约束

首先是Null,也就是空属性

 我们先创建一个表来认识并描述这个属性

create table if not exists myclass(
class_name varchar(20) not null, 
class_room varchar(20) not null, 
othher varchar(20) );

这是我们建表时在我们的属性后面带上not null

建表成功后我们desc 命令可以看class_name和class_room 的Null属性不是空的(我们在建表时规定了not null)

 当我们在三个字段中插入了数据

可以看到我们添加的数据都被添加进了表中

 

当我们第二次插入数据时没有插入other字段内容,此时查看表的内容other字段的内容被默认设置为NULL, 

当我们第三次插入数据时,没有规定class_room,此时插入出错 ,提示我们class_room插入违规;

当我们第四次插入数据时,规定了class_room插入字段为NULL,此时他也提示我们class_room插入不能为空。

所以我们在设计数据库表的时候,一定要在表中进行限制,满足上面条件的数据就不能插入到表中。这就是“约束”。

二.默认值(default属性)

默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。如果用户选择不使用自己的数据,那么默认值就会生效。

我们依然先创建一个表

并且在age字段和gender字段后加上我们默认的缺省值

当我们第一次向表内插入数据时,我们全部使用自己的数据

 可以看到表内都是我们刚刚自己插入的数据

第二次插入数据我们选择直插入姓名

 可以看到年龄和性别都设置为了我们建表时期的默认值。

同时default和not null 并不冲突,而是互相补充的。

接下来再创建一个表,不用null和default

当我们没有设置默认值时,只插入了年龄,可以看到name为NULL

所以我们要明白是null约束了自己还是default约束了自己。 

三.列描述

列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解。

mysql> create table tt12 (
 -> name varchar(20) not null comment '姓名',
 -> age tinyint unsigned default 0 comment '年龄',
 -> sex char(2) default '男' comment '性别'
 -> );

我们先使用命令创建一个表,并且在创建的字段后加上comment描述字段 

通过desc查看不到注释信息:

mysql> desc tt12;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| name | varchar(20)          | NO   |     | NULL  |    |
| age  | tinyint(3) unsigned  | YES  |     | 0     |    |
| sex  | char(2)              | YES  |     | 男    |    |
+-------+---------------------+------+-----+---------+-------+

 通过show可以看到:

mysql> show create table tt12\G
*************************** 1. row ***************************
   Table: tt12
Create Table: CREATE TABLE `tt12` (
`name` varchar(20) NOT NULL COMMENT '姓名',
`age` tinyint(3) unsigned DEFAULT '0' COMMENT '年龄',
`sex` char(2) DEFAULT '男' COMMENT '性别'
) ENGINE=MyISAM DEFAULT CHARSET=gbk
1 row in set (0.00 sec)

 通过以上命令就可以查看表中字段的注释。

四.zerofill(0填充)

这个约束是关于显示方面的约束,我们同样创建表举例证明

 可以看到我们在创建表时并没有指明int的大小,但是表中的int 中出现了(10),这是因为我们的MySQL操作会被后台的Mysqld收到,他会在后台做出一些优化,进行的动态的调整。

我们在t17中给a插入1,b插入2 

 

看到插入进去了

此时我们修改t17表的b的属性

再展示表的内容

就可以看到b有十位数了。

这就是zerofill(0填充)的操作,当我们创建表或者修改表的时候如果特意声明了zerofill,那么就会在我们的表格中补0。

当我们在尝试插入更多的数据

可以看到虽然插入的数据已经多于0填充的位数,但是依旧可以插进去,他只是可以帮我们做格式化显示。

五.主键约束

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

首先我们先创建表时先用primary约束

 create table if not exists test_key (
 id int unsigned primary key comment '这是学生的学号', 
 name varchar(20) not null 
);

这次的表我们发现id字段在Key被标上了PRI,以为主键列

接下来我们继续往里插入数据

展示一下表的内容

 此时我们将张飞换成刘备,id还是为1;

可以看到相同的值他不会让你插入了,只有我们修改主键的值才能继续插入

当id值只有一个和时,我们便可以精准的找到他,并且可以精准的对其进行增删查改

 虽然每个表只能有一个主键,但并不意味着表中的主键只能添加给一列。

一个主键可以被添加到一列,或者多列上,添加在多列上就叫做符合主键。

我们可以创建一个表来演示

mysql> create table tt14(
-> id int unsigned,
-> course char(10) comment '课程代码',
-> score tinyint unsigned default 60 comment '成绩',
-> primary key(id, course) -- id和course为复合主键
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> desc tt14;
+--------+---------------------+------+-----+---------+-------+
| Field  | Type                | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| id     | int(10) unsigned    | NO   | PRI | 0       |    |     <= 这两列合成主键
| course | char(10)            | NO   | PRI |         |    |
| score  | tinyint(3) unsigned | YES  |     | 60      |    |
+--------+---------------------+------+-----+---------+-------+

id和course合起来成为一个主键

当我们向里面插入数据的时候两个主键的内容不能是相同的,否则会受到主键的约束。

可以看到报错的内容是'1235-40' ,所以这两个主键合在一起被称为一个主键。

那这个例子也是再说一个人可以选不同的课程,但是一个人不能选相同的课程。 

六.唯一键

我们直接建表来认识唯一键

可以看到我们给id这是为了唯一键

我们再向表中插入几组数据

可以看到NULL也是可以插入进去的,而且可以多次的插入,NULL并不会引起冲突

唯一键的本质和主键差不多,唯一键允许为空,且可以多个为空,而主键不能为空。

我们可以简单理解成,主键更多的是标记唯一性的,而唯一键保证的是不和别的信息出现重复。

这里的道理有些绕,我们再建表举例说明

我们将id设为主键,电话和名字没有添加任何约束,并且向表中插入三条数据

可以看到因为id为主键约束所以不能插入相同的,而数据中wdd和wjl 的电话却是相同的,从逻辑上来讲我们的电话没有相同的,所以这里插入数据出错了。

这里的意思就是说我们主键需要保持唯一性,但是不可否认的是我们的电话号没有相同的,所以我们的电话号码也需要保持唯一性。

七.外键约束

外键用于定义主表和从表之间的关系,也就是注重的是表和表之间的关联:外键约束主要定义在从表上,主表则必须是有主键约束或unique 约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。 

我们看以下案例

如果将班级表中的数据都设计在每个学生表的后面,那就会出现数据冗余,我们只需要设计成让stu->class_id和myclass->id形成关联的关系,那就是外键约束。

在这里我们将班级表称为主表

学生表成为从表,也就是说班级表要学生表要依附于班级表。

学生表是通过class_id来与班级表的id产生关联的 

我们对上面的表使用语句设计

首先是学生表:

create table if not exists student(
 id int unsigned primary key auto_increment,
 name varchar(20) not null,
 telphone varchar(32) not null,
 class_id int
  );

 

然后是班级表:

create table if not exists class(
     id int primary key,
     name varchar(32) not null
     );

我们设计表时尽量先有班级,后有学生,因为学生是依附于班级的。

所以我们不妨先新建两个班级 

此时我们向班级内插入学生

 

可以看到我们张三对应的class_id为1,但是没有明确的班级的信息

此时我们需要加上判断条件

就可以查找出id为1的班级的信息。

我们继续插入信息

 

但是我们发现wdd 的班级id为3,是不存在与班级表中的,虽然插入进了表中,但是不符合实际。 

所以现在看班级表和学生表两张表时,我们在使用当中要两张表关联在一起才能合理使用,并没有真正意义上的将信息约束在一起。

 所以我们需要构建外键约束。

因为从表和主表产生联系,所以我们需要先删除从表

drop table student;

同时在建立一个新的从表

 

 create table if not exists student(
 id int unsigned primary key,
 name varchar(20) not null,
 telphone varchar(32) unique key,
 class_id int,

 foreign key(class_id) references class (id)

 );

可以看到最后一行代码

外键约束的语法为

foreign key (字段名) references 主表(列) 

我们需要和班级表中的id建立联系所以我们需要将class_id和id联系起来,语法如上。

这就是指明外键列和主表的列产生关系。

接下来就可以完整的观察外键约束

首先学生表是空表

我们需要向内插入数据

可以看到一班和二班都能插入学生

 当我们插入班级为三的人时

可以看到他不允许我们做插入,因为因为外键的约束所以不允许插入我们与外键约束无关的数据。

反过来要是能插入的数据,一定是符合外键约束的。

当我们要删除与外键关联的表时,是不可以直接删除的。

 外键约束保证了表和表之间联系的逻辑关系以及数据的完整性。

综合案例

有一个商店的数据,记录客户及购物情况,有以下三个表组成:

商品goods(商品编号goods_id,商品名goods_name, 单价unitprice, 商品类别category, 供应商 provider)

客户customer(客户号customer_id,姓名name,住址address,邮箱email,性别sex,身份证card_id)

购买purchase(购买订单号order_id,客户号customer_id,商品号goods_id,购买数量nums)

要求:

1.每个表的主外键

2.客户的姓名不能为空值

3.邮箱不能重复

4.客户的性别(男,女)

-- 创建数据库
create database if not exists bit32mall
default character set utf8 ;
-- 选择数据库
use bit32mall;
-- 创建数据库表
-- 商品
create table if not exists goods
(
   goods_id  int primary key auto_increment comment '商品编号',
   goods_name varchar(32) not null comment '商品名称',
   unitprice  int  not null default 0 comment '单价,单位分',
   category  varchar(12) comment '商品分类',
   provider  varchar(64) not null comment '供应商名称'
);
-- 客户
create table if not exists customer
(
   customer_id  int primary key auto_increment comment '客户编号',
   name varchar(32) not null comment '客户姓名',
   address  varchar(256) comment '客户地址',
   email  varchar(64) unique key comment '电子邮箱',
sex  enum('男','女') not null comment '性别',
   card_id char(18) unique key comment '身份证'
);
-- 购买
create table if not exists purchase
(
   order_id  int primary key auto_increment comment '订单号',
   customer_id int comment '客户编号',
   goods_id  int comment '商品编号', 
   nums  int default 0 comment '购买数量',
   foreign key (customer_id) references customer(customer_id),
   foreign key (goods_id) references goods(goods_id)
);

以上就是关于表的约束的内容,其实总的来说是为了防止我们在使用MySQL时插入不合法的内容。

如果以上内容对你有所帮助还请三联支持,感谢您的阅读。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐