【数据库】MySQL表的约束
首先表的约束是什么?表的约束就是未来在插入数据库中的表中的数据是符合预期的。当我们在向表中插入数据时,如果我们插入的数据和表中的类型不符合,那么数据库就会约束我们提示我们插入正确的数据。
约束的最终目标就是保存数据的完整正确性和符合要求。
为了更好的使用表我们必要更多的约束条件。
一.空属性(Null属性)
之前我们在desc table检察表的时候会看到表反面有如许几组数据
https://img-blog.csdnimg.cn/direct/7d618557ec3140a3960cee8412cd39b7.png
那么这些就是表的约束
首先是Null,也就是空属性
我们先创建一个表来认识并描述这个属性
create table if not exists myclass(
class_name varchar(20) not null,
class_room varchar(20) not null,
othher varchar(20) ); 这是我们建表时在我们的属性反面带上not null
https://img-blog.csdnimg.cn/direct/192290ece3994b5f9e6449eb27fe2aaf.png
建表成功后我们desc 命令可以看class_name和class_room 的Null属性不是空的(我们在建表时规定了not null)
当我们在三个字段中插入了数据
https://img-blog.csdnimg.cn/direct/738703ffb3494caebc3609d0c08c033e.png
可以看到我们添加的数据都被添加进了表中
https://img-blog.csdnimg.cn/direct/bd9cc61cfff545acaf4618c7ff888e29.png
当我们第二次插入数据时没有插入other字段内容,此时检察表的内容other字段的内容被默认设置为NULL,
https://img-blog.csdnimg.cn/direct/da7b1486b5444986ad1c81b67e5f21b7.png
当我们第三次插入数据时,没有规定class_room,此时插入出错 ,提示我们class_room插入违规;
当我们第四次插入数据时,规定了class_room插入字段为NULL,此时他也提示我们class_room插入不能为空。
以是我们在设计数据库表的时候,一定要在表中进行限定,满意上面条件的数据就不能插入到表中。这就是“约束”。
二.默认值(default属性)
默认值:某一种数据会常常性的出现某个具体的值,可以在一开始就指定好,在必要真实数据的时候,用户可以选择性的使用默认值。如果用户选择不使用本身的数据,那么默认值就会收效。
我们依然先创建一个表
https://img-blog.csdnimg.cn/direct/bc8047c515484f7e963a1349ca1000a0.png
并且在age字段和gender字段后加上我们默认的缺省值
当我们第一次向表内插入数据时,我们全部使用本身的数据
https://img-blog.csdnimg.cn/direct/5a8265bb65984e1e8d3fdb68f0895adc.png 可以看到表内都是我们刚刚本身插入的数据
第二次插入数据我们选择直插入姓名
https://img-blog.csdnimg.cn/direct/7c46b2eed9664f6fbbc73c68ed81231d.png
可以看到年事和性别都设置为了我们建表时期的默认值。
同时default和not null 并不冲突,而是互相增补的。
接下来再创建一个表,不消null和default
https://img-blog.csdnimg.cn/direct/5847f13507bc404f9f54faa2ee83f66a.png
当我们没有设置默认值时,只插入了年事,可以看到name为NULLhttps://img-blog.csdnimg.cn/direct/8ee6f83961e3407c8e0c2bf3795010a4.png
以是我们要明白是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填充)
这个约束是关于表现方面的约束,我们同样创建表举例证明
https://img-blog.csdnimg.cn/direct/a42c48a004814eef844f08ce939499b8.png
可以看到我们在创建表时并没有指明int的大小,但是表中的int 中出现了(10),这是因为我们的MySQL操作会被背景的Mysqld收到,他会在背景做出一些优化,进行的动态的调解。
我们在t17中给a插入1,b插入2
https://img-blog.csdnimg.cn/direct/53009fae5ae34fe88bd5a5c6515ca26a.png
https://img-blog.csdnimg.cn/direct/3a0cee57e6b94357ba71548bfe6ca906.png
看到插入进去了
https://img-blog.csdnimg.cn/direct/bf503ada62de4c97b14b8b8f9c9923ec.png
此时我们修改t17表的b的属性
再展示表的内容
https://img-blog.csdnimg.cn/direct/2e239c49047649eaa2796a84236aed1e.png
就可以看到b有十位数了。
这就是zerofill(0填充)的操作,当我们创建表或者修改表的时候如果特意声明白zerofill,那么就会在我们的表格中补0。
当我们在实验插入更多的数据
https://img-blog.csdnimg.cn/direct/f84a8fb7a28844cf9b31bcbd471a47c6.png
可以看到虽然插入的数据已经多于0填充的位数,但是依旧可以插进去,他只是可以帮我们做格式化表现。
五.主键约束
primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个
主键;主键所在的列通常是整数类型。
首先我们先创建表时先用primary约束
create table if not exists test_key (
id int unsigned primary key comment '这是学生的学号',
name varchar(20) not null
); https://img-blog.csdnimg.cn/direct/aaecca251d714ae19c82de508016dc28.png
这次的表我们发现id字段在Key被标上了PRI,以为主键列
接下来我们继承往里插入数据
https://img-blog.csdnimg.cn/direct/3582744ae24a4dbca91a3c0f2349831c.png
展示一下表的内容
https://img-blog.csdnimg.cn/direct/427023df88074ba5b36a98fcc590aa05.png
此时我们将张飞换成刘备,id还是为1;
https://img-blog.csdnimg.cn/direct/6e89a08de82940648cdf48a400d0ac91.png
可以看到雷同的值他不会让你插入了,只有我们修改主键的值才气继承插入
https://img-blog.csdnimg.cn/direct/f4b49a90f1fd4f12843de8a43547dce9.png当id值只有一个和时,我们便可以精准的找到他,并且可以精准的对其进行增删查改
https://img-blog.csdnimg.cn/direct/134c61a9d95d49969b4af8416b5bbd0f.png
虽然每个表只能有一个主键,但并不意味着表中的主键只能添加给一列。
一个主键可以被添加到一列,或者多列上,添加在多列上就叫做符合主键。
我们可以创建一个表来演示
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合起来成为一个主键
当我们向里面插入数据的时候两个主键的内容不能是雷同的,否则会受到主键的约束。
https://img-blog.csdnimg.cn/direct/19eee163022d4d0a93ead246be0ab445.png
可以看到报错的内容是'1235-40' ,以是这两个主键合在一起被称为一个主键。
那这个例子也是再说一个人可以选不同的课程,但是一个人不能选雷同的课程。
六.唯一键
我们直接建表来认识唯一键
https://i-blog.csdnimg.cn/direct/d2e0a294c57b490ea795c198a933208d.png
可以看到我们给id这是为了唯一键
我们再向表中插入几组数据
https://i-blog.csdnimg.cn/direct/572d444c913642178d4a4c2269cb20c6.png可以看到NULL也是可以插入进去的,而且可以多次的插入,NULL并不会引起冲突
https://i-blog.csdnimg.cn/direct/20824216a5bf4b10b28138bdcbd77aa2.png唯一键的本质和主键差不多,唯一键答应为空,且可以多个为空,而主键不能为空。
我们可以简朴明白成,主键更多的是标志唯一性的,而唯一键保证的是反面别的信息出现重复。
这里的道理有些绕,我们再建表举例说明
https://i-blog.csdnimg.cn/direct/85b0e9f93f054ad69d47ec6390b084fd.png我们将id设为主键,电话和名字没有添加任何约束,并且向表中插入三条数据
https://i-blog.csdnimg.cn/direct/db80438a069a463a9d9ae26d998e9275.png可以看到因为id为主键约束以是不能插入雷同的,而数据中wdd和wjl 的电话却是雷同的,从逻辑上来讲我们的电话没有雷同的,以是这里插入数据出错了。
这里的意思就是说我们主键必要保持唯一性,但是不可否认的是我们的电话号没有雷同的,以是我们的电话号码也必要保持唯一性。
七.外键约束
外键用于界说主表和从表之间的关系,也就是留意的是表和表之间的关联:外键约束重要界说在从表上,主表则必须是有主键约束或unique 约束。当界说外键后,要求外键列数据必须在主表的主键列存在或为null。
我们看以下案例
https://i-blog.csdnimg.cn/direct/3efed10000d545a8a1fc5d33023aab84.png
如果将班级表中的数据都设计在每个门生表的反面,那就会出现数据冗余,我们只必要设计成让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
);
https://i-blog.csdnimg.cn/direct/fcd52ad88cd84417b11fd905e6be6d2e.png
然后是班级表:
create table if not exists class(
id int primary key,
name varchar(32) not null
);
https://i-blog.csdnimg.cn/direct/28ac1d79b0ac4799baf62ea2c905aaaf.png
我们设计表时尽量先有班级,后有门生,因为门生是依附于班级的。
以是我们不妨先新建两个班级
https://i-blog.csdnimg.cn/direct/f8826ca981544cb8a7ec4490bdbae7a2.png
此时我们向班级内插入门生
https://i-blog.csdnimg.cn/direct/9a409a1d30f74058aa2191d753c4f5b5.png https://i-blog.csdnimg.cn/direct/e60bd56028cc4522befe196f1f1ef580.png
可以看到我们张三对应的class_id为1,但是没有明确的班级的信息
此时我们必要加上判断条件
https://i-blog.csdnimg.cn/direct/44c03cc723274379ba48681d2719c743.png
就可以查找出id为1的班级的信息。
我们继承插入信息
https://i-blog.csdnimg.cn/direct/03d9b97f2d65478ab996b4bcae453952.png
但是我们发现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接洽起来,语法如上。
这就是指明外键列和主表的列产生关系。
接下来就可以完整的观察外键约束
首先门生表是空表
https://i-blog.csdnimg.cn/direct/fe90edc9ea75447bab97686bee2e1820.png
我们必要向内插入数据
https://i-blog.csdnimg.cn/direct/2a2208bc1cb74523a8c8026b57556886.png
可以看到一班和二班都能插入门生
当我们插入班级为三的人时
https://i-blog.csdnimg.cn/direct/b8a4ec11707c4530a776142f206497fe.png可以看到他不答应我们做插入,因为因为外键的约束以是不答应插入我们与外键约束无关的数据。
反过来要是能插入的数据,一定是符合外键约束的。
当我们要删除与外键关联的表时,是不可以直接删除的。
https://i-blog.csdnimg.cn/direct/98df5d70f0334993a3b2bbfd2e6d24ce.png
外键约束保证了表和表之间接洽的逻辑关系以及数据的完整性。
综合案例
有一个商店的数据,记载客户及购物情况,有以下三个表组成:
商品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时插入不合法的内容。
如果以上内容对你有所帮助还请三联支持,感谢您的阅读。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]