MySQL表的约束

真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。
表的约束很多,这里主要介绍如下几个: null/not null,default, comment, zerofillprimary
keyauto_incrementunique key

一、空属性

两个值:null(默认的)和not null(不为空)
数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办
法参与运算。

创建一个班级的表,里面包含两个属性,一个是班级名,一个是班级教室,要上课这两个都不是空,所以设置not null约束,那么插入数据时就不能有空的:

 

 这里报错为没有缺省值,是因为没有设置值时默认使用缺省值,而没有设置缺省值,缺省值默认为null,但是Null约束归定了不能为空,所以是报错没有设置缺省值;

Null约束管理的是真正插入数据了,若是有一个属性NUll是not null,那么就不能插入null;也就是说NUll触发约束时是显示插入数据时:

 

 二、默认值

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

Null和default并不冲突 ,而是相互补充的;

涉及到Null时,用户插入数据,并且插入null或者合法数据;涉及到default时,用户没有插入数据时使用default,若是没有default报错;

当某一个属性的Null约束是not null而且没有设置default时,我们知道没有设置default时,默认值给null,但是此时是不允许插入null的,所以此时相当于没有设置default,就会报错。

 

三、列描述

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

 

四、zerofill

a后面是10,b后面是11(符号位),这些数字都是为了zerofill准备的,当设置了zerofill之后,查看数据就会格式化输,前面不够补0,若是zerofill比数据还要短,那么就显示原数据

比如插入(1,2),查询时就会显示(0000000001,0000000002)

插入(1000,2),但是zerofill是3,那么显示的还是(1000,002);

 

若zerofill字段小于数据长度呢?

 

五、主键

主键是表中的某一列(属性),这一列唯一标识了一个记录,比如学生的学号,唯一标识了这个学生的性别、年龄、成等等;

主键是唯一的,并且是不能为空的,一个表只能有一个主键;

###1、创建主键方式

在建立表时在属性后面增加 primary key字段进行约束

 主键唯一并且主键值唯一

 还能再建表之后再设立主键:alter table table_name add primary key(字段列表)

###删除主键:

alter table table_name drop primary key;

复合主键,就是一个表有多个不同的属性共同组成一个主键,这些属性被当作一个整体,唯一性体现也是整体的,就是说其中一个被改变时不影响,同样也不能为空;

复合主键创建的方式相同

插入数据时也不能插入空并且主键的属性整体不能相同

 

 

六、自增长

###定义:auto_increment,设置了自增长的属性列在进行插入数据时,若是没有给值,系统会默认给一个这个属性列中最大的值+1的值,得到一个新的不同的值;自增长通常配合主键一起使用作为逻辑主键

###特点:设置了自增长约束的列必须是一个索引(key行有值)并且是整形类型的,自增长在一个表中只能出现一个。

这个值是会有记录的,每次记录的都是对应自增长中最大值+1,作为下一次插入没有给值得自增长值; 

通过 函数 select last_insert_id() 查询上一次插入时的自增长值(批量插入后查询,查出的是第一个插入的值)

 

七、唯一键

unique key:所约束的属性列的各个值必须唯一,可以为空; 

八、外键

foreign key(从表列)references   主表(主表列) 

###定义:外键是两个表之间通过某一个属性之间进行的联系;外键约束定义在从表上,被约束的这列在主表中是主键或者唯一键;定义外键之后,从表这列被约束的数据要么是有合法值要么为null;外键的存在维护了完整性约束。

例子:一个学生表,包含学生的各种属性,其中有一个属性是班级id,若是在这个学生表中查看班级id就会有很多重复的,因为可以出现很多学生在同一个班级的情况;那么定义一个班级表,其中包含主键班级id和班级名;再将学生表中的班级id定义为外键,关联的是班级表的主键id,此时查看起来就会很方便;并且更重要的一点就是有了完整性约束,就是给学生表插入新数据时,插入的所属班级id的值不能是主表班级表中主键id不存在的值。

先创建主表:

再创建从表:

给主表插入数据,表示能收学生的班级号有哪些;再给学生表插入数据,合乎情理的是插入数据时对应班级号的一列班级表中id列存在的值或者是null表示还没有给这个学生分配班级:

 

实例:

有一个商店的数据,记录客户及购物情况,有以下三个表组成:
商品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)
结合生活我们知道:客户和商品之间是通过购买关联的,购买时关联了商品和客户,也就是说若是一个购买字段存在,那么客户和商品就必须存在;那么在这里客户号和商品号就是购买表的外键:

不能插入外键关联主键中对应属性列中值不存在的 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值