【数据库】MySQL表的约束
首先表的约束是什么?表的约束就是未来在插入数据库中的表中的数据是符合预期的。当我们在向表中插入数据时,如果我们插入的数据和表中的类型不相符,那么数据库就会约束我们提醒我们插入正确的数据。约束的最终目标就是保存数据的完整正确性和符合要求。为了更好的使用表我们需要更多的约束条件。
首先表的约束是什么?
表的约束就是未来在插入数据库中的表中的数据是符合预期的。当我们在向表中插入数据时,如果我们插入的数据和表中的类型不相符,那么数据库就会约束我们提醒我们插入正确的数据。
约束的最终目标就是保存数据的完整正确性和符合要求。
为了更好的使用表我们需要更多的约束条件。
一.空属性(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时插入不合法的内容。
如果以上内容对你有所帮助还请三联支持,感谢您的阅读。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)