粉丝5905获赞2.3万

正在学数据库的你,对数据库当中的这个标识列和至尊列都了解吗?哈喽,大家好,我是陈轩,论文贾。那今天我们就来聊一聊数据库当中的这个标识列,然后我们可以看到现在呢,我打开了一个这个表,这表红外我还没有保存哈,先把它保存一下, 然后保存好了之后呢,我们来看一下什么是这个标识列,或者是字增列。我们在打开这个数据库的这个表的设计器的时候呢,我们选中一个列,可以看到在下面, 在他的这个下面的这个列属性里面有一个什么呢?有一个这个标识规范默认了他是一个否的一个状态,那我们打开它,点开这个小的加号,打开它, 后面有一个是标识,是否是标识,我们可以选择,当我们选择下拉列表,选择 是的时候,就代表着你的这个列, user id, 这个列它就是一个标识列了,那在标识列呢?嗯,我们也把它叫至尊列吧,然后呢它里面有两个属性, 第一个标识增量和标识种子。那么在标识列当中什么是标识增量和标识种子呢?我们来看一下第一个标识种子, 标识种子就是表示你这个数据从 多少开始,从多少开始,那标识增量,增量是什么?就是每一次针对于每一条数据 增量多少增量是指在前前一条数据的基础上去一次递增,去一次递增,就是我们这两个 这两个标识和标识增量。那好多地方呢,又把它这个标识标识列呢,又叫做至增列,那至增列,至增列,我们把它解释一下,就是自己操作,无需手动去操作,那我们现在来打开这个表看一下, 然后我们右键把它打开编辑。第一个我们可以看很清楚的,看到什么呢?第一个他的这个帽子,他是灰色的, nul 跟这个后面的颜色是不一样的,一个是灰色的,一个是黑色 色的。让我们去写写值,你看他是不能录入进去的,他提示我们这下面显示了单元格,是指读的,也就是说我们不需要去手动的去给他设置,他自己就会给咱生成。那我们写个张三, 然后再换行,你看他这个一生成了,这个一是怎么来的?一是怎么来的?一就是在我们刚刚设计的这个位置,标识种子这个地方来的,标识种子这个地方来的,然后我们来看一下,在这里,那我们再加一条, 啊啊小王,然后再往下,你看他变成二了,小李他变成三了,那这个时候你的标识种子和嗯,这个标识增量就起作用了。那如果 我想给他改一下,我想给他改一下,我把这数据里面的这某些值给他删掉,比如说我把这条值给他删掉,把三给他删掉了, 那么我们来看一下,结果哈,三三掉了。按照常理来讲,我们这个数据他是字增列吗?是吧?我们在操作下一条数据的时候啊,小花 他会变成几呢?我们正常的思维会觉得,哎,他应该是还是三吧,因为你第三条都都删掉了,所以说这条应该继续三,继续是第三条,是吧?一 它变成了四了,为什么它变成四了呢?是因为 identity, 这是 identity 的一个特性, i n t t 标识列特性是什么呢?即便是中间有删除了的数据, 也算,也算在递增里面,也算在递增值里面,也是说你这个值已经有了,他就不会再去重复创建,不会重复创建 相同的 id 值,不会重新重复创建相同的 id 值。那么刚刚的问题说明白之后呢?第三个问题来了, 这个问题是什么呢?在一个表当中可以同时存在多 个标识念吗?这个问题我们一起来验证一下,那我这个地方呢,有一个 unif 二,这个 unif 二呢?我用来区别 unif 这个 unif 二。那我现在设计表, 打开这个设计表,我们来看一下,在这里面呢,有一个 user id, 有一个 user number, 他们两个都是硬特型的,为什么我要强调他们都是硬特型的呢?因为你要做这个,嗯,标识列的,这要设置标识列的这个字段,他必须是数字类型的,只有数才可以制增吗?是吧?我们先把这个写一下, 备注,要设置 标识列的字段,必须是数字型,必须是数字型的,这样才可以做字针。那么我们来看一下,在这里哈,第一个我们给他设置成什么呢?设置成标识列, 标识规范设置成,是啊,这是第一个有了,是吧?我们按 ctrl s 这个表结构,新的表结构保存完整了,然后我们刷新一下,嗯,然后打开, 然后这个是灰色的,对吧?这个是灰色的,那么我们后面的只是可以编辑的一一一,然后呢给他改成一吧,然后呢三三选号,一是吧?他这个绘画掉了, 这个绘画掉了,是吧?那说明他这个已经我们设置的那个标识列他已经生效了,那么接下来我们要验证刚刚的问题,刚刚的问题是什么?在一个表当中可以同时存在多个标识列吗?咱们来看一下他到底是否可以存在 这个表?我们现在把第二个,第二个它这个 mon 是否哦?我们把它设置成是, 然后 ctrl 加 s 保存了,保存之后,那么我们来看这个列,来看下这个表, 设计表,这个编辑表,然后呢?诶,第一个没有被绘画掉,第二个被绘画掉了,我们来看一下第二个被绘画掉了,这就说明什么呢? 在一个表当中呀,只能存在,最多只能存在一个标识列, 标识列最多只能存在一个,你要么没有,要有只能有一个,要么没有,要有只能 有一个,有且只能有一个,要有只能有一个。我们可以把他们家的有且只能有一个,那就是这个就是我们刚刚讲的这个了,你会发现当我们给他第二个设置成这个标识面的时候,他就把第一个标识面的这个给他顶掉了,给他给他顶掉了, 那这就是我们今天要讲的内容,就是标识列,这标识列就是,嗯,很多朋友在就是在初学这块的时候是迷迷糊糊的, 这个 id 怎么他怎么不具有连续性?然后为什么就有的时候创建的时候,哎,可以有多个你,你觉得你创建了多个,但其实他已经把前面那个给点掉了,那这就是我们今天的内容,大家可以自己去试试一下。


你知道买鞋口中的至尊锁吗?比如说我们的主见 id, 他是至尊的,我们现在开了左右两个窗口,我们先在左边去开始一个试物,然后我们这时候去插入一条数据,比如说这条数据叫做试, 我们在这里去插入一下,然后现在保存的他的主机 id 为四,然后我们再在右边这个窗口也去同样的去开启事务。那么我们在这时候,比如说我们去刷新啊,然后会发现这边依然是三条,因为我们左边的事务还没提交,所以说右边查出来还是三条,那么我们这时候再去插入一条数据, 比如说我们在这里去插入一条叉叉,然后我们去保存一下,这个时候会发现变成了五,你会发现在买些个默认的可重复读隔离级别中,虽然我们查不了左边的这个四的数据,但是他的一个至尊是根据这里跳过的,从五开始的。 如果说这个时候我们想强行插入世界的数据,我们看行不行呢?比如说这里我们去保存下这里就会发现他一直在转圈圈了,这就是买 c 口中的指针锁。如果说我们把左边的这个事物给提交了, 然后就会发现右边这个报错了,他会说我们的主机 id 四已经重复了,然后我们这里点就好,我们在左边再去刷线下,然后在右边我们去还原,然后这个时候我们再去提交下刚才的事物,然后这里再去刷线下,会发现这条五就出来了。

不知道大家有没有考虑过一个问题,如果买这个自身 id 用完了会怎么样?也就是说如果自身 id 达到上限了,会发生什么事情?那这个问题其实可以分为两种情况来说。第一种情况,有主见的情况, 一般我们在做数据库设计的时候,都会把组建 id 设置成至尊,我们都知道在 maxx 里印的类型是四个字节,那么如果有符号位的话,上线就是二到三十一次放剪影, 这个数字大概是二十一亿的样子,那对于无符号来说就是二三十二次方减一。为了测试,其实我们可以上线一张表,并且把这张 id 设置为有符号位的最大值减音,然后再插入一条数据,这样我们表里面就有一条达到有符号位最大值上限的数据, 这时候如果我们再次去插入一条数据的话,就会看到错误提示,组建冲突,也就是说如果设置了组建,并且至尊的话,达到至尊组件上线就会爆作重复的组建 k。 第二种情况,没有组建,如果说没有设置组建赢了 db 则会自动帮我们创 建一个六个字节的 log, 因为 log 是没有符号位的,所以它的最大长度是二十四八十方减一。那么要怎么测试这种情况呢?我们可以通过命令拿到麦克的进程 id, 通过 gdp 先把 loid 修改为一,然后去插入值为一二、三的三条测试数据, 之后再次通过 gdp 修改 log 为二十四十八十方,然后再次插入三条四的数据四、五、六。最后查询数据会发现表里面最终存在四条数据,分别是四、五六三,这是为什么呢?因为我们先设置 log, 从一开始,所以一二三的 log 也就是一二三 修改落 id 为上线值之后,落 id 会从零重新开始计算,所以四五六的落 id 就是零一二。那么由于落 id 为一二的数据已经存在,所以一二两条数据被覆盖了,最终表里面的数据就变成了四五六三。

哈喽,大家好,我是鱼仔。在大多数的场景下,使用 mysco 的自增 id 作为主见是最优的方案。使用数据库自增 id 速度快,主见页以近乎顺序的方式填写,提升了页的利用率,并且递增的数字也十分利于检索,在查询效率这一块也会比其他方案更好。 同时在使用时还不需要代码主动去生成主见,但一项技术很难在所有场景下都保持完美,当遇到下面这些场景时,就不建议使用自增 id 作为主见了。 一个很常见的场景就是分库分表。分库分表场景下一个很重要的原则是主线 id 不能重复,因此如果单纯使用自动 id, 就会导致同样的 id 指向不同的数据,因此需要设计其他的主线 id 生成方案。方案有很多,最简单的就是按 id 进行取模, 比如原先是 id 为一、二、三、四、五、六的六条数据,需要分到两个表中,就可以用 id 对二进行取模运算,取模后的数据就会被分散到不同的表中或者进行分片。比如一到一千万的数据放在某个表中,一千万到两千万的数据放到某个表中, 还可以依赖一些开源的 id 生成算法,比如推特的雪花算法、美团的 lift 算法等等。 另一个场景是我最近工作上遇到的,我目前做的是弊端的数据产品会存在内部环境和客户环境同时生产数据的情况, 比如系统刚部署到客户环境时,初始化了一批数据,接着客户开始生产新的数据,我们内部也开始产生数据。当版本进行更新合并的时候,如果使用了数据库的自身 id, 就会出现两边 id 冲突的问题,因此在设计 时我们就没有使用数据库自动 id 作为主见,而是搞了一套 id 生成服务,保证唯一并且带有一定业务属性,这样在做数据圈已合并时,只需要导入数据。此刻以上就是本期视频的全部内容了,我是鱼仔,我们下期再见。