表的完整性约束
那么,根据真实的业务需求如下
·会员号字段设置主键,不能为空并且保持唯一 ;
·主键若是整数类型,需要自增;
·宠物昵称字段不能为空;
·手机号和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)
);
执行成功
添加数据验证
不要担心,经过之前学习过的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; -- 查看表结构
也可以在设计表中查看表的结构