首先表的约束是什么?
表的约束就是未来在插入数据库中的表中的数据是符合预期的。当我们在向表中插入数据时,如果我们插入的数据和表中的类型不符合,那么数据库就会约束我们提示我们插入正确的数据。
约束的最终目标就是保存数据的完整正确性和符合要求。
为了更好的使用表我们必要更多的约束条件。
一.空属性(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,是不存在与班级表中的,虽然插入进了表中,但是不符合实际。
以是现在看班级表和门生表两张表时,我们在使用当中要两张表关联在一起才气合理使用,并没有真正意义上的将信息约束在一起。
以是我们必要构建外键约束。
因为从表和主表产生接洽,以是我们必要先删除从表
同时在创建一个新的从表
- 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时插入不合法的内容。
如果以上内容对你有所帮助还请三联支持,感谢您的阅读。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |