【数据库】MySQL表的约束

没腿的鸟  金牌会员 | 2024-9-5 15:50:42 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 994|帖子 994|积分 2982

首先表的约束是什么?
表的约束就是未来在插入数据库中的表中的数据是符合预期的。当我们在向表中插入数据时,如果我们插入的数据和表中的类型不符合,那么数据库就会约束我们提示我们插入正确的数据。
约束的最终目标就是保存数据的完整正确性和符合要求。
为了更好的使用表我们必要更多的约束条件。
一.空属性(Null属性)

之前我们在desc table检察表的时候会看到表反面有如许几组数据

那么这些就是表的约束
首先是Null,也就是空属性
 我们先创建一个表来认识并描述这个属性
  1. create table if not exists myclass(
  2. class_name varchar(20) not null,
  3. class_room varchar(20) not null,
  4. 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来进行了解。
  1. mysql> create table tt12 (
  2.  -> name varchar(20) not null comment '姓名',
  3.  -> age tinyint unsigned default 0 comment '年龄',
  4.  -> sex char(2) default '男' comment '性别'
  5.  -> );
复制代码
我们先使用命令创建一个表,并且在创建的字段后加上comment描述字段 
通过desc检察不到注释信息:
  1. mysql> desc tt12;
  2. +-------+---------------------+------+-----+---------+-------+
  3. | Field | Type                | Null | Key | Default | Extra |
  4. +-------+---------------------+------+-----+---------+-------+
  5. | name | varchar(20)          | NO   |     | NULL  |    |
  6. | age  | tinyint(3) unsigned  | YES  |     | 0     |    |
  7. | sex  | char(2)              | YES  |     | 男    |    |
  8. +-------+---------------------+------+-----+---------+-------+
复制代码
 通过show可以看到:
  1. mysql> show create table tt12\G
  2. *************************** 1. row ***************************
  3.    Table: tt12
  4. Create Table: CREATE TABLE `tt12` (
  5. `name` varchar(20) NOT NULL COMMENT '姓名',
  6. `age` tinyint(3) unsigned DEFAULT '0' COMMENT '年龄',
  7. `sex` char(2) DEFAULT '男' COMMENT '性别'
  8. ) ENGINE=MyISAM DEFAULT CHARSET=gbk
  9. 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约束
  1. create table if not exists test_key (
  2. id int unsigned primary key comment '这是学生的学号',
  3. name varchar(20) not null
  4. );
复制代码

这次的表我们发现id字段在Key被标上了PRI,以为主键列
接下来我们继承往里插入数据

展示一下表的内容

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

可以看到雷同的值他不会让你插入了,只有我们修改主键的值才气继承插入
当id值只有一个和时,我们便可以精准的找到他,并且可以精准的对其进行增删查改

 虽然每个表只能有一个主键,但并不意味着表中的主键只能添加给一列。
一个主键可以被添加到一列,或者多列上,添加在多列上就叫做符合主键。
我们可以创建一个表来演示
  1. mysql> create table tt14(
  2. -> id int unsigned,
  3. -> course char(10) comment '课程代码',
  4. -> score tinyint unsigned default 60 comment '成绩',
  5. -> primary key(id, course) -- id和course为复合主键
  6. -> );
  7. Query OK, 0 rows affected (0.01 sec)
  8. mysql> desc tt14;
  9. +--------+---------------------+------+-----+---------+-------+
  10. | Field  | Type                | Null | Key | Default | Extra |
  11. +--------+---------------------+------+-----+---------+-------+
  12. | id     | int(10) unsigned    | NO   | PRI | 0       |    |     <= 这两列合成主键
  13. | course | char(10)            | NO   | PRI |         |    |
  14. | score  | tinyint(3) unsigned | YES  |     | 60      |    |
  15. +--------+---------------------+------+-----+---------+-------+
复制代码
id和course合起来成为一个主键
当我们向里面插入数据的时候两个主键的内容不能是雷同的,否则会受到主键的约束。

可以看到报错的内容是'1235-40' ,以是这两个主键合在一起被称为一个主键。
那这个例子也是再说一个人可以选不同的课程,但是一个人不能选雷同的课程。 
六.唯一键

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

可以看到我们给id这是为了唯一键
我们再向表中插入几组数据
可以看到NULL也是可以插入进去的,而且可以多次的插入,NULL并不会引起冲突
唯一键的本质和主键差不多,唯一键答应为空,且可以多个为空,而主键不能为空。
我们可以简朴明白成,主键更多的是标志唯一性的,而唯一键保证的是反面别的信息出现重复。
这里的道理有些绕,我们再建表举例说明
我们将id设为主键,电话和名字没有添加任何约束,并且向表中插入三条数据
可以看到因为id为主键约束以是不能插入雷同的,而数据中wdd和wjl 的电话却是雷同的,从逻辑上来讲我们的电话没有雷同的,以是这里插入数据出错了。
这里的意思就是说我们主键必要保持唯一性,但是不可否认的是我们的电话号没有雷同的,以是我们的电话号码也必要保持唯一性。
七.外键约束

外键用于界说主表和从表之间的关系,也就是留意的是表和表之间的关联:外键约束重要界说在从表上,主表则必须是有主键约束或unique 约束。当界说外键后,要求外键列数据必须在主表的主键列存在或为null。 
我们看以下案例

如果将班级表中的数据都设计在每个门生表的反面,那就会出现数据冗余,我们只必要设计成让stu->class_id和myclass->id形成关联的关系,那就是外键约束。
在这里我们将班级表称为主表
门生表成为从表,也就是说班级表要门生表要依附于班级表。
门生表是通过class_id来与班级表的id产生关联的 
我们对上面的表使用语句设计
首先是门生表:
  1. create table if not exists student(
  2. id int unsigned primary key auto_increment,
  3. name varchar(20) not null,
  4. telphone varchar(32) not null,
  5. class_id int
  6.   );
复制代码
 

然后是班级表:
  1. create table if not exists class(
  2.      id int primary key,
  3.      name varchar(32) not null
  4.      );
复制代码

我们设计表时尽量先有班级,后有门生,因为门生是依附于班级的。
以是我们不妨先新建两个班级 

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

可以看到我们张三对应的class_id为1,但是没有明确的班级的信息
此时我们必要加上判断条件

就可以查找出id为1的班级的信息。
我们继承插入信息
 
但是我们发现wdd 的班级id为3,是不存在与班级表中的,虽然插入进了表中,但是不符合实际。 
以是现在看班级表和门生表两张表时,我们在使用当中要两张表关联在一起才气合理使用,并没有真正意义上的将信息约束在一起。
 以是我们必要构建外键约束。
因为从表和主表产生接洽,以是我们必要先删除从表
  1. drop table student;
复制代码
同时在创建一个新的从表
 
  1. create table if not exists student(
  2. id int unsigned primary key,
  3. name varchar(20) not null,
  4. telphone varchar(32) unique key,
  5. class_id int,
  6. foreign key(class_id) references class (id)
  7. );
复制代码
可以看到最后一行代码
外键约束的语法为
  1. 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.客户的性别(男,女)
  1. -- 创建数据库
  2. create database if not exists bit32mall
  3. default character set utf8 ;
  4. -- 选择数据库
  5. use bit32mall;
  6. -- 创建数据库表
  7. -- 商品
  8. create table if not exists goods
  9. (
  10.   goods_id  int primary key auto_increment comment '商品编号',
  11.   goods_name varchar(32) not null comment '商品名称',
  12.   unitprice  int  not null default 0 comment '单价,单位分',
  13.   category  varchar(12) comment '商品分类',
  14.   provider  varchar(64) not null comment '供应商名称'
  15. );
  16. -- 客户
  17. create table if not exists customer
  18. (
  19.   customer_id  int primary key auto_increment comment '客户编号',
  20.   name varchar(32) not null comment '客户姓名',
  21.   address  varchar(256) comment '客户地址',
  22.   email  varchar(64) unique key comment '电子邮箱',
  23. sex  enum('男','女') not null comment '性别',
  24.   card_id char(18) unique key comment '身份证'
  25. );
  26. -- 购买
  27. create table if not exists purchase
  28. (
  29.   order_id  int primary key auto_increment comment '订单号',
  30.   customer_id int comment '客户编号',
  31.   goods_id  int comment '商品编号',
  32.   nums  int default 0 comment '购买数量',
  33.   foreign key (customer_id) references customer(customer_id),
  34.   foreign key (goods_id) references goods(goods_id)
  35. );
复制代码
以上就是关于表的约束的内容,实在总的来说是为了防止我们在使用MySQL时插入不合法的内容。
如果以上内容对你有所帮助还请三联支持,感谢您的阅读。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

没腿的鸟

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表