00:00
败军约束呢,咱们就告一段落啊,接下来的话呢,我们来讲下个约束啊,叫做check约束,顾名思义check呢就是检查的意思,所以我们也称为呢叫检查约束作用是什么呢?我们来检查某个字段的值是否呢是符合相应的一些要求啊,通常呢,一般是值的一些范围啊,我们称为呢叫做这个check约束啊,就用它的来进行个实施,好紧接着这块我们会提到了说呃,5.7呢是不支持咱们这个check约束的,那什么意思呀。也就是说呢,咱们ansi啊,这个还记得咱们一开始讲SQL标准的时候提过是吧,叫美国国家标准局啊,这个组织的话呢,它是制定了咱们这个SQ的这个标准,嗯,这个标准里边呢,咱们提到了这个叫check约束了。啊,提到了这个check约束,但是呢,呃,不同的数据库厂商呢,我们说对于这个circleq这个标准的支持的力度呢,是不是不一样的呀,那其中这个MAS呢,在5.7当中啊,它就不支持这个check约束。啊,这个所谓的不支持呢,不是说我们用的话呢就报错了,而是呢,你写上以后呢,运行也不会报错,但实际实施的时候呢,发现不起作用,哎,这个就是我们所谓说的这个不支持。
01:06
那像咱们前面也提到过5.7也不支持呢,咱们SQ92语法里边这个这个加号的方式呢,去表示这个什么呀?呃,外连接是吧,左外连接外连接不允许,而且呢,还不支持咱们这个for join对吧,这都是我们说这个不同数据库呢,在SQL知识方面的一些不同点。行,那么5.7呢是不支持的,但是在咱们这个8.0当中呢,它就支持了,就有这样一个变化啊,那对于咱们说这个Oracle来讲,Oracle呢,自始至终呢,它都支持这个拆运输。那那这块呢,我们做一个这样的演示啊,大家需要知道我们这样的一个区别,那首先的话呢,我们还是回到咱们自己的这个MYSQL层面啊,咱这块呢,该第八个了。哎,这个我们称为呢,叫做check约束。OK行,那这块我们来看一看这个check艺术呢,是如何去起作用的,那我们此时呢,去创建一个这个table啊test,那我们看这边呢,该多少呢,F5刷新。
02:00
啊,太十是吧,哎,这样子。哎,没问题,好,这里边呢,我们定一个ID是一个in类型的,来一个last name是一个what类型,比如来一个这个事物没问题,然后呢,这个salary,哎,工资我们来一个DECSIM是吧,哎,然后十。十逗号二,然后呢,在后边呢,我们加上一个check,那此时呢,我们比如说要求这个salary大于这个2000块钱。啊,2000块钱啊,什么意思啊,就是如果呢,你要是聘用员工的话呢,这个工资呢,你至少得比2000要高啊这个就好比是呢,就是一些城市呢,是不是都会设置这个城市的一个最低生活的一个标准,你要低于这个标准的话呢,这个员这个员工他就没法生存下来了。对吧,你像北京这块呢,呃,北京其实啊,就是大家有有好多同学应该都是不在北京工作啊,呃,你到这个一线城市里边,你会发现呢,其实这个吃上的话呢,嗯,可能会高一点,但是其实高的有限,你要自己做的话呢,基本上没有太大区别啊,你像北京现在这个外边卖的这个菜,这个可能比我老家石家庄呢,可能有的菜还要便宜一些。
03:05
啊,你要说买衣服的话呢,那衣服也是,甚至说呢,在这个一线大城市里边一些大厂的这个当地的一些衣服呢,它还打折,你反而到下边一些城市里边,它也不打折是吧?呃,有这么个局面啊呃,你要说比较成本高的地方呢,就是这个出行方面可能会贵一点,但是这个也贵的也有限,相较于你在一线大城市薪资来讲呢,它这个高的也有限,主要呢,就是房价的问题,那你说我不买房,不买房租房的话呢,可能也会贵一点。你像我这个呃,读书的时候呢,呃在市区里边,然后呢,很多同学毕业之后呢,他们就想在市区里边工作,也在市区里边住,不想呢,每天呢,从这个像嗯沙河呀,呃像这个回龙观呀,是吧,甚至还有在这个通州啊等等往市区里边去挤啊,这个觉得受不了,他们就住在这个哎公司的旁边啊,走路十分钟就到公司了,那你租一个小两室,或者是一个呃大的这个,这个一室一厅的这种啊,通常都六七千以上啊,至少六七千以上了。
04:02
都比较贵一些是吧,啊,所以说在北京这样的一线大城市里边呢,很大一部分这个成本呢,你都花在这这个都花在这个住的这个方面了。啊,那像这个北京市的这个人力资源与社会保障局啊,他就会规定啊,你要在北京生活的话呢,你不能给用给这个员工低于2000块钱啊,他租吃住这块呢,它得有成本这样要高一些的,那我们就有这样一个约束对吧?好,那此时的话呢,我们选中这样一个表,咱们点击执行啊,就把这个表呢,就创建成功了,那创建成功以后的话呢,我们这块呢,Insert into,咱们这个T10呢,咱们看一看啊Y64。首先那ID呢,我写成一啊,姓名呢我们叫Tom,这个工资的话呢,咱们先来一个2500。啊,这个是满足咱们这个check要求的,对吧?来我们跑一把成功了,那成功以后的话呢,我们选中呢,再去做一个执行,这呢,比如我写成是个二,这个叫TOM1,咱们工资呢,给他改成1500,那这时候能不能成功呢,走一下,那此时呢,是不是就报这个错误信息了啊,就是添加失败。
05:02
啊,这个我们表示一下啊,要添加。啊,失败那就意味着咱们在这个8.0当中啊,咱此时这个check约束呢,你看还确实起作用了是吧,那它是起作用的,那么在咱们的啊,注意CTRLC以下我放到咱们这个5.7当中,这是咱们5.7的数据库,没问题吧。嗯,咱们这个,呃,Select这个a wash一下,咱们这块呢,是5.7的。行,那在这里边呢,咱们把这个事呢,也再跑一下啊,Use一下呢,Test DB test13。嗯,支持咱们F5刷新一下啊这个啊好,我们选中了做个执行,那么我们首先呢,也是创建这个T10这个表吧。成功了,然后呢,我们往里边呢,去添加一下这个,呃,记录啊,这个添加成功了,然后我们再看这个事呢,我们往里边走一下,哎,大家你会发现呢,是不是他呢,不是失败的,而是一个成功的呀,那也就意味着我们此时呢去select。
06:02
啊,Select星from一下咱们这个菜石。诶这么着是吧,来我们选中咱们做一个执行,你会发现呢,这个一千五你看是不是就添加成功了,而我们CTRLC一下,咱们在这个8.0当中呢,我们如果做一个拉的星呢,哎,它就没有是吧,那这呢,我们就说清楚这个插口约束啊,在这我们说明一下这个my circle5.7呢,它是不支持。啊,这个check约束的。啊,然后呢,我们买8.0。哎,这个支持这个拆约束。嗯,那这呢,我要提出它的点呢,目的是什么呢?还给大家在5.7中测试了一下,因为呢,咱们现在在企业当中啊,很多企业呢,主流的还都没有使用这个8.0,而是用的5.7,所以你知知道呢,就5.7呢,你这个设置这个check呢也白设置啊,就这个道理好另外一个层面呢,我们CTRLC啊,因为我这也装了这个Oracle了,咱顺带呢,就看一眼Oracle吧。这呢是咱们这个circle啊,我粘过来,嗯,咱们就在这创建一个表是吧,嗯,在咱们这儿呢,它用的是叫what two啊what two,好,那选中了我们做个执行。
07:09
那就可以了,创建好以后的话呢,我们就要,诶这个咱们都有这个语句了,我就直接拿过来了。往里边呢,去添加这个数据,哎,CTRLC拿过来。在这儿我们加了一条记录,走起。那加成功了是吧,加成功以后呢,我们去select星from一下咱们test这个十,哎,选中执行好,你会发现呢,这条记录呢,是不是就添加成功了,然后呢,我们接着呢,再去把这个一千五的这个我们加进来,那我们选中了做一个执行,诶大家会发现呢,此时你看就报错了。是吧,诶这个SC是我们这个用户啊,行,那就相当于这个Oracle,我这还是用的Oracle这个十这个版本的啊,算是比较早的一个版本了,那就是在咱们Oracle当中啊,其实它很早啊,它就支持咱们这个拆口约束啊,相对应来讲,Oracle呢,对于这个ansi的这套标准的整体执行的来讲,还是比较呃标准的啊,或者我们说那个PG circle。
08:05
啊,Put the great circle是吧,哎,现在排名是第四了,哎这个数据库呢,它支持这个nsi,这个标准呢,也是比较这个。规范一些的啊,咱MYSQ呢,这里边儿有好几个小细节呢,它是支持的不是特别好是吧,但是我们也看到了他这个支持是越来越严谨啊,这样的一个情况啊。好,那么关于这个check约束呢,咱们也就说到这儿吧,啊,这里边儿还有几个例子,大家下来有兴趣的你可以再看一下,行,然后接下来的话呢,我们去谈一下这个叫default的约束,Default呢,我们称为呢叫默认值的一个约束。比如说我们给某一个字段啊,或者某一个列呢,指定个默认值,一旦咱们指定以后呢,你在插入数据的时候,没有显示的去复制它就会用这个默认值,哎,这个应该很好理解啊,很好理解,好,那我们来谈一谈这个叫default的一个约束。这是咱们的这个九块八是吧。那开这个九了啊,我们叫default。
09:01
来这个约束,哎,默认值的一个约束,哎,顾名思义啊,就是我们给它设置默认值的,来咱们这块呢,去create一个table啊,TEST11吧。嗯,这样好,ID呢是个特类型,然后呢,我们来一个什么呀,还是lastname。嗯,然后呢,是一个water类型15,嗯,再来一个salary吧,那也比如说salary,我们来一个这个DEC。哎,是逗号二,然后呢,我们来一个这个depot。哎,Depo,我就写成2000吧。那也就是说呢,如果salary呢,我们不去赋值的话呢,它默认值呢,就是给了2000,好,我们选中执行。哎,这块呢,给我们报错了,说lastname啊,这个少个逗号是吧。哎,我们选中了直行。嗯,可以了,此时呢,我们DA一下啊,TEST11。哎,我们选中。跑起来这个时候呢,我们会看到这呢,是不是有个2000的一个,诶这个显示对吧,那就意味着当我们去insert。
10:03
哎,Into啊,TEST11这块我们指明是ID,然后last name,还有这个salary,我先把这个salary呢也加上,这是一。Home,对吧?然后呢,这个我们来一个3000。好,就是当我们要显示的给这个salary赋值的话呢,那肯定是用你自己负的这个值。啊,包括我们这块呢,带去这个select星是,哎,From一下我们这个test。十一来,我们此时呢,选中做个执行没问题,就是3000啊,那当我们呢,再接着写一个iner语句,这时候salary啊,我就不往里边放了,哎,这个3000块钱呢,咱们也给它去掉。啊,这个咱们换一个人吧,这个我们的TOM1,那这时候我们去引射了以后,按照咱们原来的思路的话呢,就是你要是没有指明salary salary呢,相当于是一个not纸对吧?哎,当然现在呢就不是了,诶因为我们给他指定那个默认值,诶指定的是2000,所以这块呢,他就有这个2000的一个,诶声明了。
11:00
啊,这呢,可以理解成呢,咱们理解成叫9.1就是在。哎,是不是create table的时候呢,我们去添加这个默认值约束是吧。在添加,哎,这个约束好,那如果我们在create table的时候呢,没有去加,后期能不能补呢?这就我们下一个问题了,这就是在out table的时候。哎,在。那al table的时候呢,我们去添加这个约束啊,这呢也是没有问题的啊,这咱们比如说再换一个啊CTRLC啊,这个我们拿过来,这个我们叫12啊,这个位置呢,不要了。啊,这样就我们这个表,哎,我们选中执行。嗯,Death test12,此时的话呢,这个里边没有这个默认值的一个约束啊,正常看都是个no啊,然后呢,我们可以out table,嗯,咱们叫TEST12啊,怎么写呢,叫moify。哎,Multiify就修改嘛,修改这个salary啊,我们就把salary呢就写到这儿,然后呢,哎,你不是叫DECSIM吗?然后十逗号二,其实这时候呢,大家你顺便呢,如果你想改,比如改成八逗号二这个也都可以的啊,然后在后边呢,大家你去加上这个叫default。
12:11
啊deft,比如我们这个改成两千五吧,啊这样是可以的,来我们此时呢,选中啊执行。哎,然后你再去做这个de来,我们看一下这个呢,你看就改成八逗号二了,同时这个两千五呢,也就加上了。哎,我就不去演示呢,这个添加的时候呢,没有给这个字段赋值是不是两千五了,这个显然是有效的,那这呢是我们去添加约束,那对应的话呢,如果你想去删除的话呢。啊,也是在at table的时候呢,我们去删除的。嗯,这个删除的话呢,其实也比较简单,那你就像我们把这个呢,CTRLC拿过来,我们去指明它是八逗号二在后边这块呢,你把它就去掉就完了,它呢类似于咱们前面讲的是不是那个no no啊诶非空还是空,哎到时候你在这块呢,其实去这个体现就可以了,来我们这块呢,再选中执行。啊,再去做一个D,大家你会发现呢,这个位置呢,就没有默认值的约束了。
13:05
理解吧,哎,就是这个意思啊,行,那这个默认值约束呢,相对来说也比较简单一些啊,这呢我们就诶给大家做一个讲解就可以了,那整个呢,关于这个check约束和默认值的约束呢,都不是特别难,咱们在开发当中的这个check约束呢,你看你能想到咱们MYQ呢,5.7,它连知识都不支持了,所以这个呢,相对来说用的就会少一些,是吧?而对于这个默认值的约束呢,一般咱们都还会考虑去做添加。那添加的话呢,到底我们怎么去用啊,那这下边这块呢,其实你看就看到一道面试题了。这面级的第一个,那其实这块呢,就会涉及到了我们这个默认值的一个场景,咱们在建表的时候呢,诶通常呢,会给某些字段呢,加上这样的一个情况,那nono这个不用多说了,就是你是非空的是吧,但是同时的话,我们还会补一个呢,叫default啊,单引号里边啥也不写,或者叫DEFAULT0,这个呢,就针对的你是这种数值类型的啊,这个呢,针对的就是我们说的字符串类型的,我们会加上这个默认值是这样的。
14:03
哎,为什么会加他呢。啊,那就意味着就是当我们不去给这个字段赋值的时候呢,它就不是闹了,而是用的这个符号,或者呢,就是负的一个零。那延IG呢,我们主要目的呢,就是为了避免咱们在没有复制的情况下呢,它给我呃显示的是个闹纸,那为什么不想要闹纸啊。啊,因为闹值的话呢,比较特殊,只要他参与运算的话呢,我们前面也提到过,他返回的是不是就都是这个nor啊,哎不太好是吧,哎不太好,另外的话呢,这个nor的话呢,它也效率不高啊,像咱们在这个索引当中的话呢,这个no呢,它相当于是个空的情况啊,不如我们单独有个值,这个方便我们去做一个比较。诶,所以说通常咱们再给一些字段啊,这个在设置的时候呢,我们可以考虑呢,给它加个default啊,就是它有的时候呢,会去会是空嘛,是吧,但是这个时候呢,我们就别让它是空了,咱们给他指定一个值,哎,这呢就是我们实际当中的一个开发的经验啊。好,那么咱们关于这两个关键字呢,就讲完了,那顺带的这个面试题这块呢,那还有两个小点,咱们就一起呢来说了,那这块呢,提到一个叫auto increment,咱们前面讲的那个自增列是吧,说这个auto increment这个字段呢,它一定是从一开始的嘛。
15:14
嗯,一定是从一开始的嘛。啊,这个咱们没讲过啊,没讲过啊,这块我们面试的时候有时候问到你了,就是恶心你的是吧,正常来讲呢,咱们在这个表中,比如说给ID这个字段呢,哎,通常咱们都是给主键去设置的啊叫P我就捡起吧。Primary这个key了是吧,然后呢,给它加了一个叫auto increment,那咱们接下来去往这个表中ID,表中赋值的时候,ID呢,咱们就一般呢,就不要去给它显示负了,就让他自己去往上增啊,那通常呢,我们说都是从一开始的,这没问题,那现在问就是说我们写的autoquiment它一定是从一吗?其实不是的啊,怎么讲呢?诶我就不去写代码了,说清楚啊,那我们这个表造完以后呢,我们首先隐色的时候呢,比如我就显示的把这个ID呢写上了,此时呢,我把这ID的赋值是十。啊,一运行还成功了,那就负了个十,诶,然后接下来你再去隐色的时候呢,我就不去给ID赋值了啊,此时的话呢,它就会在十的基础上呢,往上去递增,那下一个就是11了。
16:11
啊,十二十三十四十五十六。哎,就是这样个情况啊。哎,我就不演示了啊,大家自己你自己测试一下就行啊,或者说这个事呢,你应该能想到,为啥呢。咱们前面呢,给大家说了一个这个它的一个持久化的一个问题啊,当然咱们引出来一个,不管是5.7还是8.0哈,就是它会在内存中去保存一下你暂存的这个当前的这个计数器。啊,比如说一开始我们说是一了,然后呢,一改成二了,二改成三了,三改成四了,它这个是不断的在变化的,但是你要第一次一上来呢,本来人家这块呢,是想给你去把一写出去,你上来就来了个十,相当于它就在这个呃,计数器里边就更新为十了,所以你再去添加的时候,你不指定ID,它就从十开始,接着往后走就该11了。啊,就是这么个道理,所以说呢,在auto increment字段啊,是从一开始的嘛,啊,那就看你一开始的时候是不是指定了啊,如果说你第一条在插入记录的时候呢,比如说你指定的ID是五,你自己指定了啊,那么下一条记录呢,你要是不指定ID,它就默认该从六开始了。
17:10
哎,就是这个意思,好,这是这个啊,然后下一个。并不是每个表都可以任意指定存储引擎吧?啊,关于存储引擎的,咱们没有详细的展开来说啊,没有详细展开来说,嗯,这个在什么时候咱们可以设置呢?呃,简单提一下,咱们在这个造表的时候呢,我说在这个位置,咱们其实啊这这么着吧。我这么着说大家知道了啊,我们去搜一下。这个table,咱们这个T12是吧,好这块呢,我们选中呢做个执行,哎,大家能看到是不是整个这块有个这个信息,那么你看这个语句呢,就是create table啊,谁谁谁谁谁这么长,在这个后边的话呢,咱们前面讲过,咱可以呢去在这个位置呢,去写叫char character set是吧,我们可以指定它的字符集,同时的话呢,在这个小括号外边呢,你可以去指定这个叫。
18:00
哎,Engine啊,Engine呢,就是我们说的引擎的意思,哎,默认呢,咱们说从5.5以后呢,是inno DB啊,以前的话呢,是用这个MYSEM是吧,这就是存储引擎的意思,说这个存储引擎我们可以随便去指定嘛,实际上正常来讲的话呢,都可以去指定啊,你想指定什么就指定什么的啊,正常来说是这样子的啊,但是呢,这里边有个问题,就是卖件约束呢,它不能够跨引擎,就是说这是个主表,这是个存目表,从表吧,就是你这两个表呢,得用一个引擎,你不能这块用的是MYSM,这个用的in DB啊,这就不合适了。啊,这个主要是由于这个外径约束的这样的一个原因的限制啊,这个大家了解就行啊,因为咱们已经看过阿里的标准了,是不是就不让呢,咱们在这个数据库这个层面呢,咱们去用这个外界,包括用这个机连是吧?呃,应该在应用层面啊,在我们这个Java的后台层面呢,我们去做这样的一个呃,限制啊,确保我们数据的一个叫什么引用的完整性,就这个词呢,咱们给他讲一个重点吧。哎,引用完整性。
19:00
啊,理解是吧,就是我们最开始上面这块提到的,哎,什么叫引用完整性,OK,那么至此的话呢,咱们约束这一章啊,咱就讲完了。啊,咱就讲完了这块呢,稍微的小结一下,就是大家在我们创建表的时候啊,因为咱们这里边儿呢,你具体一个约束呢,提到过好多点创建表的时候,修改表的时候,呃,都可以去添加,还可以删除等等的啊,那么我建议大家呢,你只需要掌握什么呀,针对于非空,针对于唯一性约束,针对于主键约束啊,包括咱们下边提到这个叫默认值约束。这是吧,这几个约束呢,在创建表的时候呢,怎么去加上这些约束。啊,大家掌握一下。啊,一般加上约束以后呢,通常咱们都不一般啊,都不会去删的啊,你要真忘了怎么删了,你就回来看一下我的课件,看一下咱们这个讲的这个代码,你是不是也就会了呀,啊就是你可以不用刻意去记了。啊,也不用可以去记了,然后order table的层面呢,我们去这个增加约束呢,那个你也不用记了,咱们一般呢,在造一个表的时候,通常一开始诶,到底有哪些约束,这个都一般都会想清楚,呃,尽量少的在修改表的层面呢,去这个添加或删除啊。
20:12
好,那么关于约束这块呢,咱们整体上就讲到这儿啊,后边呢,咱们在造表的时候呢,大家要记得去用上这里边儿的一些约束啊就可以了。
我来说两句