00:00
那接下来的话呢,咱们看一看下个约束啊,叫做主见约束,那primary key翻译过来呢,就一个主见的意思了,它的作用什么呢?用来唯一的标识表中的一行记录啊,唯一的标识表中的一行记录了,就是用来区分表中的不同的行的,诶大家你回忆一下,咱们一开始讲这个约束的时候呢,提到过一个概念叫数据的完整性,对吧?那么在数据完整性里边呢,我们提到一个概念叫做实体的完整性,什么叫实体完整性呢?就是在同一个表当中,咱们不能够存在两条完全相同的无法区分的记录。啊,区分不出来这两条记录了,那不行,那我们怎么呢能保证这个事儿呢?诶,我们就使用一个主见的概念呢就可以了,那就是我们这里边提到的一个primary key OK,好,那么这个主见约束呢,这里边提到了,说说它呢,相当于是唯一约束加上一个非控约束的组合。哎,也就是说呢,我们这个主键的特点呢,就是兼具了唯一性的特点和非空约束的特点,那主键约束的列呢,不允许重复,也不允许放空值,你比如说呢,我们这个盘ID呢,这个就生命成主键了,那我们这块呢,再添加一条记录呢,这个是空值就不行。
01:07
然后当我们再添加二条记录呢,这个ID呢是50也不行,因为已经有50这个部门了,那这呢就是这个主键约束它的一个作用,OK,那下边呢是一些描述,那我们简单来看一看,说呢,一个表中啊,最多只能有一个主见约束啊,建立主见约束呢,可以在列级别创建,也可以在表级别创建啊,就叫列级约束表约束啊就生命的位置不一样了,这个呢,大家要注意,我们一个表中只能有一个主键约束。那我们一会儿呢,可以试一下,说我们创建两个看行不行对吧,那为什么只能有一个呢?哎这呢,实际上就涉及到了我们这个主键因数啊,它对应的啊叫做主键索引了。那这个主键索引呢,其实就涉及到咱们这个底层,在存储这个表中数据的时候呢,咱们使用的一个结构叫做B加数,这个咱们到下篇的时候呢,重点给大家讲解,这个B加数的话呢,它呢,呃,这个实际上呢,就是我们存储这个表中数据的一种数据结构了,那它呢,就是依照的这个主件来进行的一个创建,那你想想我们表中呢,说只能有一个主键了,是不是就按照你唯一的这个主键的这种索引的方式呢去创建了,你要有俩,那那不好使啊,那到底按照谁呀,是吧,最多就一个啊,就这一次。
02:12
好,下边呢,说这个主键约束呢,对应着表中的一列或者多列啊,多列的话呢,相当于一个多列约束了,就跟咱们上面提到那个,呃,多列的那个唯一性约束,我们称为呢,叫复合的唯性索引,这呢就是复合主键了,对吧。行,那下边呢,就提到了说,那如果是多列组合的这个复合,这个这个主键的约束的话呢,那么这时候呢,这一列呢,都不允许空值,然后呢,组合的值呢,不允许重复,这个咱们一会一测试就知道了,主键的名呢总是primary,那就算呢,我们自己命名了,这个也没有用啊,这个一会儿我们也可以进行测试,下边呢,就提到了说我们创建的这个主键约束,它上面会自动的去添加一个叫主键索引。那根据这个组件呢,进行查询的时候呢,效率会更高啊,因为咱们整个这个表的数据啊,那我们看到的是呈现给我们的是这样子的,那么底层存储的对应的数据结构呢,我们叫做这个B加。
03:02
那就是这个B加数,那么它就是基于我们这个主键索引呢去创建的啊,那如果说你要是用其他的那些索引呢,去查询数据的话呢,最终呢,还得去查我们这个主见的这个表啊,其实这块涉及到一个词呢,叫做回表啊,现在呢给大家就不解释了啊,一说呢,这个说多了,大家也现在听不懂,咱们到下篇的时候呢,有好几张呢,就是针对这个索引呢展开来讲解的,这也是我们SQ优化的非常重要的这个内容,OK,下面提到了说如果呢,我们删除了这个主见约束了,那主见约束呢,对应的索引呢,也就自动删除了。啊,注意这个主见约束呢,我们是可以删掉的,但是呢,大家不要删啊,这个就是没事自己给自己找事儿的啊,千万不要删啊,一会儿呢,我们这个讲到这块呢,删除这个事儿的时候,我们再提一下这个问题,OK,下边需要注意的一点是呢,不要修改主键字段的值啊,因为主键呢是我们数据记录的唯一的标识,修改了以后呢,可能会破坏数据的完整性。啊,这块呢,主键的这个值呢,咱们通常都不会去动的啊,还是那个意思,你要修改这个主键值呢,也会影响这个,呃,数据呢,在底层B加数列结构中存储的位置会来回移动啊这个呢会影响性能啊,一般的咱们都不会去动的啊,你该排序你排序呗,是吧?啊你尽量不要动这个主键值啊,这个基于我们下一章到时候讲一说,大家都能明白,现在呢,可能还有点刻意的去记的意思是吧。
04:19
行,那下面呢,我们就来演示一下这个主键的约束的这个特征。好,这呢是咱们该讲的是第五个点了是吧,那咱们再回到这个最上边这块,把这个主键约束啊,CTRLC咱们粘过来。哎,逐渐约束好的,那首先的话呢,我们来谈一谈什么呀,就是在创建表的时候呢,如何呢,去声明这个主见的约束对吧。好,那这块我们把这个。哎,拿过来CTRLC。哎,在这块啊5.1。好,那这个我们就直接呢去创建了啊,Create一个table,嗯,这块呢,我叫test叫TEST3吧,啊可以这样啊,其实这里边呢,咱们都可以理解成针对的是像员工啊啊或者学生啊是吧,这样的这个数据行,这个呢叫ID啊in类型的,然后来一个这个lastname啊work类型。
05:09
这个呢,我们来一个15啊,在这个Oracle当中啊,多说一句,Oracle当中呢,如果我们定义字符串类型呢,它叫what to就加个二就可以了。啊,就是稍微有点不太一样啊行,然后呢,我们再加一个比如说salary啊工资,那salary呢,是一个那戴。啊,这个十逗号二,嗯,再来一个email吧。啊,这个蓝莓来一个这个what啊,这个25,好,那我们就声明这样的几个字段就可以了,呃,这里边呢,我们下边呢去声明这个主见啊,刚才提到了,说在一个表当中,我们最多呢只能声明一个主见,对吧?那主键的话呢,我们先写上啊,Primary key,那这呢是一个了,这就相当于是使用的叫什么呀,叫列举约束的方式。诶没有问题,那我们再提一下说哎,我这时候呢,我把它呢也加上一个primary key,看看可不可以呢,来我们选中做个执行,那这时候你就报错了啊multiple,然后primary可以DeFine,就是你有多个是不是primary可以去定义了是吧?哎这呢就是一个错误的。
06:09
哎,就这个情况,那由他呢,我们引发出来呢,说呃,一个表中。啊,一个表中那最多啊,只能有一个主键约束。啊呃,最多呢只能有一个,那么从实际开发中的这个情况来看的话呢,我们呃,前面呢讲表的时候呢,都没有去创建主见约束,那以后的话,我们讲完之后呢,大家以后在创建表的时候呢,都要加上主键约束,那就加一个,所以这里边提到最多呢,你也别说是不是可以没有,你就别想没有了,就是要提供一个主键啊,这要注意行,那这个呢是错误的,我们CTRLC咱们再重新来啊,我这写一个叫TEST4是吧,好,那这个位置呢,我就删掉了。哎,那这块我们升到这儿啊,那咱呢从长计议啊,咱们先看一看谁适合去加啊,谁适合去加,那我们现在呢,说了主见约束的特征是什么呢?啊,刚才说了啊,主见约束它的一个特征。
07:02
它的特征呢,就是非空且为一。啊且唯一啊,那就用于呢唯一的标识啊,表中的一条记录。哎,就这个作用,那有的同学呢,可能会说说老师呀,这个唯一性不就可以去唯一的标识表中一条记录吗?那比如说我们前面设置的这个email,咱们设置过呢,它是一个有的是吧,那每个员工的这个邮箱都不一样,那不就已经是唯一的了吗。呃,其实的话呢,大家想想不一定,因为咱们说呢,Unique作用的这个字段呢,是可以是不是多次添加空值的呀,那比如我们想查询这个表,说where啊,Email啊,Is no,那有可能是不是一下子就出来多条记录了。那说白了,你这块呢,是不是又没有标识,呃,是一条记录啊,那怎么办呢?那我们在唯一的基础之上啊,Email是唯一的基础之上呢,我们要求你是非空的,那这时候呢,是不是就真正的每一条记录呢?那这个字段呢,值就全都不一样了,那闹呢是不是?呃,你要闹闹,因为飞空了嘛,就不允许它为闹了,那就一定会有值,而且呢,都不一样。
08:05
啊,那么我们就用这个主键约束呢,去做一个衡量就可以了啊,那这时候我们就需要考虑说这个表中哪些字段呢适合加成主键,因为只能有一个对吧。好,那大家呢,应该整体一打点,看是不是这个ID呢就比较合适了,那email呢是唯一,但是它不能飞空嘛,啊像这个呢,我们说的都不太适合把它做成唯一的是吧?哎,只有ID呢是适合的,那如果我们把它呢写到这儿啊primary key。我要写在这儿的话呢,相当于就是这条呃,列举约束的方式去创建的,来我们这块走一下。执行。那这就成了是吧,哎,那我要是不写到这儿呢,哎,我们这块呢,再来一个,那我来一个TEST5。那我这个呢,就把它删掉,哎,把这个呢,我们也去掉,我写到哪呢,是不是写到这个最后啊,那这呢就是一个表级约束。哎,就表表约束好,表示约束的话呢,哎,我们前面讲唯一性约束的提到过,说可以给这个约束呢,是不是起个名字呀,那我们试图呢,去起个名字,就是PK啊,Primary key啊,是针对这个TEST5的,然后呢是这个ID是这意思吧,然后呢,Primary。
09:13
那key然后针对的是我们的ID,那就这样一个意思,来我们这块呢,把它选中呢,做一个执行。那也可以了,那都执行完以后的话呢,咱们前面呢,不是说过这样的一个,诶是不是这样的一个SQL这个查询语句,我们查看一下这个表里边儿的一个约束对吧,那首先呢,我们看针对于这个TEST4。哎,针对这个太次,哎,我们查询一下,这里边呢,就提到了你这个表里边呢,有一个约束的类型什么呢?是主见约束,那这个名字是是什么呢?叫primary。哎,是primary是吧,那因为呢,我们上边没有显示的去命名嘛,像这种列举数呢,一般咱们就都不命名了啊,没法去命名啊,那么下边这个TEST5,哎,我们再看一眼,哎,选中呢去执行,哎但是你看此时的话呢,我们这个约束的类型呢,还是primary key,但是呢,你看它这个约束的名字。
10:01
那咱们明明是不是给他起了个名,但是呢,你看这不还是叫primary呀。啊,还是个primary是吧,那我们通过这个通话界面的方式来看一下F5刷新一下,然后在这块我们打开打开这个索引,你看诶这个TEST5这里边是不是还是叫是吧,那ya IG呢,就是我们刚才这里边提到的说MYSQL的这个主键名啊,总是primary,就算你自己命名了呀,它也没有作用啊,就是我们说的这个意思。哎,针对我们这个里边还做了一个说明,然后我把这个性呢就去掉了。哎,能理解的意思是吧,那也就是说呢,咱们用这个表决数的方式去命名的话呢,实际上这块呢,我们就没有必要呢,是不是给它起名字了啊,这块我们也说一下啊,没有必要啊起名字。来起名字,他倒是呢,不给你报错啊,只是让你起了以后呢,没起作用,对吧?哎,就是这样一个道理啊。好,那么这块呢,我们针对于这个四也好,针对这个五也好呢,咱们来看一看你是不是具备这样的特征,那咱们就以这个四为例呢,来进行说明吧,那这时候我们去insert啊,Into咱们这个TEXT4。
11:06
那这呢,咱们把这几个字段呢写上啊,这个ID诶,Last name,嗯,这个salary啊,然后这个email啊,然后呢,Values,那这里边呢,咱们就不考虑别的了啊,咱就主要就看这个ID了,好,我先写一个,哎,算是一个能够添加成功的一个数据。哎,Salary,比如说4500,诶四千五这样。然后那个email,汤姆。哎,大家现在是不是都用这个QQ邮箱用的多对吧。那126呢,就是大家应聘的时候呢,可能会用这个非QQ的邮箱啊,好来这块我们选中执行,那这就成功了啊,此时呢,我们去select星。诶,From一下我们这个TEST4。哎,我们选中呢啊执行一下好,这时候呢,是我们已经添加成功的数据,那接着的话呢,我们这块啊,再来我把这个位置呢,呃,就是还写成是一啊其他的位置呢,其实目前呢,没有其他的约束啊,你就只看这个ID就可以了,我们再去执行它这块呢,就报错了。
12:05
啊,这就是个错误的情况。哎,错误的原因呢,就是因为呢,我们现在呢,是不是有一个重复性的一个一啊,就违反了我们这个主见,叫唯一性这样一个特征,好,这是一个错误的场景,然后接着的话呢,我们再来,比如呢,我把这个ID给去掉了。啊,或者说我们这个呢,没有去,呃去掉的话呢,相当于咱们就用默认值去复值的啊,跟我这块写上呢,给它写成个no,其实是一个意思是吧,好,那我们这块呢,再去执行啊,他就提到说这ID呢是不能为闹的啊,这个原因呢,也是由于我们这个主件的啊原因造成的。好,那通过这个呢,给大家去演示呢,你就知道了哦,原来说我们这个主键的特征就是非空且唯一的一个特点。啊,非空且唯一的没有问题是吧,好这个呢,大家能够去清楚,然后接下来的话呢,咱们再去怎么着啊呃,举一个叫复合的一个情况,哎,复合的一个情况啊,我呢去create一个table。啊table啊,比如我这块我叫个user吧啊这样打开啊,然后这个呢,咱们叫一个ID吧啊是一个int类型的啊这个大家呢,就主要看我这块测试就行,不用去深究说诶为什么这俩适合加成一个主见约束,就别研究这个了啊,咱就直接呢,就只是测试这个事儿啊。
13:13
那么这个name然后呢是一个water类型啊15,然后呢来一个password。那password,我们也是一个what类型的,这来一个25吧,好,那这块呢,我们写成一个表约束啊,这个country也不用写了,咱们直接呢,是不是就primary care。咱们那会儿说了,说你这个加上约束名也没有用是吧,好primary key。然后呢,哎哟。然后呢,这块呢,我们指定的是谁呢?是这个name和我们这个password。诶,它俩呢,合在一起构成我们这个叫主见约束。来我们此,嗯,这个分号就不要写了,那此时呢,我们选中呢,做一个执行,嗯,这个user色是不是已经有了呀?啊有了我们这个叫USER1吧。好选中呢,我们去做个执行。
14:00
哎,可以了,那么此时的话呢,大家注意看我们隐私的into一下,咱们这个叫USER1啊value,然后这呢,我写个一,然后这个name的话呢,我们先写一个叫Tom吧。嗯,Password ABC。好,那此时的话呢,肯定是可以成功的啊,这个没毛病是吧?好我们CTRLC一下,然后的话呢,我们现在呢,呃,这个ID呢,这就无所谓了,然后现在这个我们改成叫TOP1了。哎,这呢跟这个,那咱们说呢,算不算是一样的呢?那咱们前面讲了唯一性约束的时候呢,实际上是不是算不一样的呀,所以我们这时候再执行它是可以添加成功的。啊,比如说我们此时selecting from your,我们这个叫USER1,那咱们这块选中诶一致型你看是可以添加成功的,这个没问题是吧?呃,只要呢,联合在一起呢,它是不相同的就可以了啊然后哎,这块我们接着在这写啊然这块呢,注意看我能不能给这个位置写成是个闹呢。那能不能是闹呢?那有同学可能会想说,呃,我们这呢叫非空且为一,非空的话呢,现在联合是不是说呢,这俩合一起,只要是别都为空就行了呢,那其实呢,不然那我们执行一下,大家会发现呢,此时是不是就报错了?
15:08
哎,那这呢就是一个错误的情况,这个呢想表达的意思就是说,呃联合在一起呢,跟原来的只要是呃唯一的啊不同的就可以了,但是呢,我们关于这个闹的这个情况呢,只要你有一个是闹,那就不可以。哎,那就不可以,就像我们这里边儿提到的这个事儿。啊,如果呢,是多列组合的复合主键约束,那么这一列呢,都不允许为控制,那谁都不能为空啊,但是他们组合在一起呢,只要不重复就行,那就是刚才呢,咱们给大家演示的这样一个点。哎,这个大家注意一下,我们这里边儿这个场景。啊,能理解的意思是吧,那就可以了啊,那么我们什么时候可能会考虑这个叫呃,这个复合的主见约束呢?那其实呢,跟咱们上面讲的这个唯一性约束啊,咱们讲唯一性约束的时候呢,不是举了一个案例嘛,就是我们提到这个学生表,这个课程表,还有这个选课表是吧?哎,像这里边的话呢,我们这个ID呢,可以考虑它做成是一个主见了,你要没有这个ID的话呢,其实呃,它俩合在一起啊,就是我们这个学生的学号和这个课程的编号合在一起,我们作为一个复合的主见约束啊,也行。
16:11
啊,因为每个学生的话呢,他一定都会有各自的学号和他的这个课程的编号,然后呢,首先是唯一的呢啊其次的话呢,大家都不为空啊,可以考虑做成是一个复合的主键啊我这呢就呃这个不再去演示一遍了啊,如何去创建了。好,那这样的话呢,咱们就把这个主键如何在创建表的时候呢,去添加,是不是就说清楚了呀。哎,就说清楚了,好,那咱们接下来再去看呢,呃,如何咱们去在这个一开始的时候呢,没有添加,然后后边呢,我们再给他补上,哎这样的一个特征,哎,这对应的就是我们说的这个4.2吧。那我们相当于是啊,对应的跟上面是一样的道理啊,我去粘一下。哎,这个是吧,在table的时候呢,我们去添加这个约束。诶这样一个情况,那这块呢,我们得需要先是不是对应的有一个新的表,因为呢,我们现有的这表里边呢,咱们说最终呢,只能有一个主见约束,你不能拿着这个四啊,或者这text词五去演示了,因为已经有主见了,是吧,所以我们再来一个呃,TEXT6吧,然后这块呢,直接就把它粘过来,这个位置呢,咱们就把它去掉了,哎,逗号一下就行啊,这个我们叫一个六。
17:18
好,那此时呢,我们选中了做一个执行。哎,然后呢,我们de那TEST6。那TEST6那选中查看,哎,此时呢,这块呢,其实是没有一些标识的,我们看如何去添加啊,我们这呢叫al table,哎,TEST6TEST6是吧,然后呢,我们去ADD一个叫逐渐约束啊这个呢,嗯,咱们就直接呢就写了啊,咱们是想把ID呢,是不是生命成是一个逐主见约束是吧,我们就这样写啊。哎,Key,然后呢,你看ID,哎这样来去声明,哎,我们选中呢,做一个执行。哎,就可以了啊就可以了,然后呢,这是我们再DA一下,那你会发现呢,在这个位置呢,你看加了一个叫primary,而且呢,这个你看是个no,就是飞空的一个意思。
18:05
哎,就可以了,然后接着你再往这里边儿去添加数据呢,就保证它是非空,且是不是唯一的就可以了呀。哎,没有问题啊,没有问题行,那这呢,就我们说的这个,哎,主键的这样一个特征,然后接下来啊,4.3啊,我们就看一下如何是不是叫删除主键因数啊。哎,如何删除主键结束,那因为呢,咱们这个主键呢,刚才也看到它的名呢,总是叫做primary,所以我们删除这个主键因数的话呢,直接你就想删除这个主键就完了。啊,这个复合主件这都说过了啊,再往后那如何删除呢?Out table啊这个表明,然后drop primary key诶就完事了,哎,Drop primary key啊就是你不用再说这个主键名是啥,因为就就就要这个名是吧,只能有一个啊吧,那这块呢,比如我们就针对这个猜六啊,咱把这个给它删掉啊叫drop。哎,不是drop了,Out是吧,哎,Out table啊TEST6,然后drop什么呀?哎,Pre啊key好,此时呢,我们选中来执行一把。
19:08
哎,这时候我们再去做一个D。啊查看你看这时候是不是就没有了。哎,就没有了哈,然后这块大家注意到一个细节,你们看他这个这个位置呢,还是可以保留下来的是吧?哎,这个稍微关注一下哈,那有同学可能想说老师,哎呀,这这块我也得细节去记一下啊,这个把主键就拿个小本本就开始写了,说我们去删除主键约束的时候呢,我们这个对应的主键的这个字段上面这个no啊nono呢,还是保留的。哎,注意不要去记了。哎,为啥呀,老师。没有必要啊,为什么没有必要呢?因为我们删除主键约束这个事儿啊,在实际开发当中根本就不会去做。啊,我这块写一下在实际开发中啊,我们不会去删除表中的主键约束的。啊,你要删除主间数啊,这真是啊,说的非常精准的,就是没事找事。
20:00
啊,为什么这么讲呢?那刚才我们在这块呢,其实我给大家也提到了,就是我们这个主见约束,咱们声明在一个字段上,比如说ID上了,那么我们就会在这个字段上呢,自动会添加一个主键的索引,而我们整个这个表的数据啊,就是依据这个主键索引去构建的啊对应的数据结构呢,我们叫做B加数。诶叫做B加数,你想想我们如果要是把主键这个呃给它干掉了,是不是这个索引呢,也就干掉了,那么接下来的话呢,我们这个表基于这个,那B加数据构建的一个特征是不是就被破坏掉了,那我们这个表你同学会想说,诶老师,那我们原来没有讲这个主键约束的时候呢,这个表也没见说。这个有主见啊,那那怎么办啊,哎,那我们说这个系统呢,诶,它会自动的给我们选择一个字段。比如说你要优先有这个唯一性的这个约束的话,他就先优先选这个唯一性约束那个字段了,他去帮你构建一个AB加数。啊,那你要都没有的话呢,它会给你选择一个相对合适的一个字段,它有优化器嘛,哎去去构建,那现在的话呢,如果你要把这个干掉以后呢,他就看,诶你要是有个字段呢,是一个呃微型约束的,它就拿那个字段去构建了,那原来这个构建的被加数是不是就完全就没有用了,呃,重新的再去构建,那你要这个表中达到几百万条上千万条数据的话呢,你想想是不是一件非常崩溃的事情。
21:19
啊,就很崩溃了,就是好比是就好比是啊,这个秦王呢,秦这个原来秦朝的时候呢,建了一个阿房宫啊,虽然说还没有建完是吧,然后后来呢,一把火给烧掉了,是不是极其的可惜呀。啊,没有必要我们再去重新构建一棵新的笔加树啊,所以说呢,我们在实际开发当中,咱们这个主件元说啊,注意不要去删它啊,哎,千万不要去删。行,那么关于主见约束呢,咱们就说到这儿。
我来说两句