暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL8.0约束机制-非外键约束

爱婷如命一生一世 2021-12-15
1147

表的完整性约束

通常DBA会对表进行增删改查的操作,为了确保数据的准确和一致性,产生了约束机制!那么表没有了约束机制的话,会造成什么样的后果呢?
在建立一张宠物表的同时没有建立约束机制,那么这张表存在了很多的漏洞,比如我会员号想怎么改就怎么改也可以重复的填写,这样对业务查询会造成很大的影响


那么,根据真实的业务需求如下

·会员号字段设置主键,不能为空并且保持唯一 ;

·主键若是整数类型,需要自增;

·宠物昵称字段不能为空;

·手机号和email字段保持唯一;

·性别只能是公母;

·年龄只能在1-20之间

表中通过会员号或者手机号的唯一性进行业务办理,这就是主键的作用。

将会员号设置为主键约束并按照其他业务需求来进行约束。

create TABLE p_cats(

        mastername varchar(10) not NULL, -- 非空约束

memberld int(8) PRIMARY key auto_increment,  -- 主键约束和自增

sname VARCHAR(10) not null ,  -- 姓名不为空

age int (2) CHECK(age>=1 and age<=20),  -- 检查约束 ,限制年龄1-20

sex CHAR(1) DEFAULT '公' CHECK(sex='公' || sex='母'),  -- 默认值约束为公且只能为公或者母,MYSQL8单独提供的检查约束

phy VARCHAR(20),

dataofb date,

adds VARCHAR(25),

pn VARCHAR(11),

email VARCHAR(15) unique ,  -- 唯一约束

ckuscores DOUBLE(3,1)

);


执行成功


添加数据验证

但是我做张表的时候到了后期添加数据发现在主人姓名字段中的类型定义错了,不应该定义成Int,应该定义成char之类的。

不要担心,经过之前学习过的sql语法通过DDL和DML语句进行操作

ALTER TABLE p_cats MODIFY mastername VARCHAR(10)  not null;   重新定义字段类型和约束 DDL

UPDATE p_cats set mastername = '王青云' ;    DML

SELECT * FROM p_cats;  DQL

最终查询的结果如下

做好了表格,数据验证开始,在插入一条数据。

因为在mastername我约束了为空,而插入的数据mastername是空字段,i因此报错1048

> 1048 - Column 'mastername' cannot be null

针对这个错误,可以在网上或者经过翻译搜到一些答案的。


再插入一条数据,这条数据库中性别写成T,而约束只能是公或母

报错> 3819 - Check constraint 'p_cats_chk_2' is violated.

根据提示是检查约束chk_2被违反了,这个检查约束名chk_2是系统默认帮你起好的,在实际的运维中可以定义名称来定位错误。

再插入一条数据,这里面我将岁数超过21,而我约束只能在1-20之间

很显然,报错> 3819 - Check constraint 'p_cats_chk_1' is violated.

其检查约束名变为了1

若是都按照要求去插入,则会成功插入数据;

当然,再添加一条数据,这条数据中的内容是会员ID为重复,而我约束的这个mid是主键约束的

报错:> 1062 - Duplicate entry '1002' for key 'p_cats.PRIMARY'



经过翻译出来就是重复的和主要的

在插入一条数据,根据对email字段约束唯一的要求,在出现重复的名称就会出现报错

添加正确后就可以完整输入了


当你插入不为空字段,也是可以的,同时自增约束帮你填充了(只不过我这里之前删除了1005这个行数据,导致了再次插入就会按照1005之后的顺序)而不是1004,sex检查默认约束也帮着将默认的性别-公添加进入


对于自增约束字段,我这里是否可以为空?

insert into p_cats (mastername,memberld,sname,email) VALUES ('西尼亚王子',null,'阿比西尼亚','ab@outlook.com');

在主键约束和自增下,空值是可以被插入,并且实现自增!

如果在主键约束自增字段里 memberId添加default,证明了如果要想使用自增效果(null,default)都可以完成的。

INSERT into p_cats (mastername,memberld,sname,email) VALUES ('蓝蓝',DEFAULT,'美国蓝猫','ll@qq.com');

但是这里主键自增有个前提,比如你在自增时,别的字段出现了错误,那么再次正确执行,自增的序号将会跳到下一位。

我先插入一条数据,只不过我的邮箱字段是重复的,报错如下

> 1062 - Duplicate entry 'll@qq.com' for key 'p_cats.email'

再次插入一条正确的email字段,注意这里的自增ID号变成了1010。而不是1009,说明在之前错误的执行插入中,自增已经后台占用了浪费了,在大部分业务要求主键属性中是不要求连号的!

约束的分类

· 表级约束: 可以约束表中任意一个或多个字段,与列定义相互独立,不包含在列定义中;与定义用 , 分割;必须指出要约束的列的名称;

· 列级约束: 包含在列定义中,直接跟该列的其他定义后,用空格分割,不必指定列名;


表级约束演示

像这样的约束写法,叫做列级约束

接下来,我将重新建立一张没有任何约束的宠物龟表,来演示表级约束。

以下代码是建立没有约束表的sql语句

create TABLE p_thrtle(

    mastername VARCHAR(10) , 

memberld int(8) ,  

sname VARCHAR(10)  , 

age int (2), 

sex CHAR(1) , 

phy VARCHAR(20),

dataofb date,

adds VARCHAR(25),

pn VARCHAR(11),

email VARCHAR(15)  ,  

ckuscores DOUBLE(3,1)

)


表级约束只需要在结尾处添加逗号后即可,具体代码如下

create TABLE p_thrtle(

    mastername VARCHAR(10) not null, 

memberld int(8)  auto_increment, -- 自增约束只能在列后,不能成为表约束  

sname VARCHAR(10) not null, 

age int (2), 

sex CHAR(1) DEFAULT '公',  -- 默认值也只能成为列级约束

phy VARCHAR(20),

dataofb date,

adds VARCHAR(25),

pn VARCHAR(11),

email VARCHAR(15),

ckuscores DOUBLE(3,1),

CONSTRAINT pk_thr PRIMARY KEY (memberld),   -- 表级约束的名字指定字段

CONSTRAINT ck_thr_sex check (sex = '公'|| sex = '母'), -- 检查约束自定义名称

CONSTRAINT ck_thr_age check (age >=1 and age <= 20), -- 检查约束年龄的限制

CONSTRAINT uq_thrt_email UNIQUE (email) -- Email唯一字段约束名称

);

constrint说明


在建立外这样宠物龟表后,发现年龄字段这块的检查约束没有做的严谨,龟类毕竟能活很久

可以通过图形界面来直接修改检查约束字段 先删除后建立

同样的,需要添加数据来进行验证,正确的数据输入没有问题

接下来,输入了主键字段重复的数据,出现报错,验证设置主键id字段没有问题

当我在检查性别字段中,输入范围外的值,报错如下:

> 3819 - Check constraint 'ck_thr_sex' is violated.  明确告诉了检查约束名称

同样的,在年龄检查字段中超出了范围,也会报出之前定义好的检查字段名称

邮件字段不唯一的错误显示,

通过以上字段的验证,就可以完整测试我们的主键和约束设置没有问题。

简单地来说,将约束添加到列后叫做列约束,放置在表最后就是表约束,自增和约束只能成为列约束

添加表后的约束语句

在工作中,会出现当你创建完一张表时,发现约束忘记添加了

先新增一张只有非空约束,默认约束的表


在添加表后如何添加约束呢?

ALTER TABLE p_beetle add CONSTRAINT pk_bee PRIMARY KEY (memberld);  -- 建表后添加主键约束

ALTER TABLE P_beetle MODIFY memberld int(8) auto_increment;   -- 建表后添加自增约束

ALTER TABLE p_beetle add CONSTRAINT  ck_bee_sex check (sex = '公'|| sex = '母'); -- 检查约束自定义名称

ALTER TABLE p_beetle add CONSTRAINT  ck_bee_age check (age >=1 and age <= 70); -- 检查约束年龄的限制

ALTER TABLE p_beetle add CONSTRAINT  uq_bee_email UNIQUE (email); -- Email唯一字段约束名称

约束添加执行正确!


不插入数据验证也通过查看表的结构来验证执行结果

DESC  p_beetle; -- 查看表结构


也可以在设计表中查看表的结构


文章转载自爱婷如命一生一世,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论