<p id="1RPMBC">作者:杨敬博</p><p id="1RPMBD">爱可生 DBA 团队成员,一位会摄影、会铲屎、会打球、会骑车、生活可以自理的 DBA。</p><p id="1RPMBE">* 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。</p><p id="1RPMBG">1背景描述</p><p id="1RPMBJ">OceanBase 数据库中分为 MySQL 租户与 Oracle 租户,本文针对 OceanBase 中 Oracle 租户怎样创建自增列,以及如何更简单方便的处理自增列的问题展开介绍。OceanBase 的 Oracle 租户以下简称:<strong>OBOracle</strong>。</p><p id="1RPMBK"><strong>发现问题场景</strong></p><p id="1RPMBL">业务需要将数据库转换为 OceanBase 数据库,但源端涉及到 Oracle 及 MySQL 两种不同数据库,需要合并为 OceanBase 中单一的 Oracle 模式,其中源端 MySQL 数据库需要改造为 OBOracle 并做异构数据迁移。</p><p id="1RPMBM">在数据迁移中发现,MySQL 中的自增列()在 OBOracle 中是不支持的,在 OBOracle 对应 MySQL 自增列的功能是通过序列实现的。通过测试以及阅读相关文章,共测试完成了以下四种 OBOracle 创建并使用序列的方法。</p><p>2四种 OBOracle 创建序列方法 1方法一:SEQUENCE + DML</p><p id="1RPMBN">在 OceanBase 中 Oracle 数据库,我们可以通过以下语法创建序列:</p><p></p><p id="1RPMBO">语法解释:</p><p><ul><li id="1RPMBQT0"></p><p id="1RPMBP">是要创建的序列名称</p><p></li><li id="1RPMBQT1"></p><p id="1RPMBQ">指定使用该序列时要返回的第一个值,默认为 1</p><p></li><li id="1RPMBQT2"></p><p id="1RPMBR">指定序列每次递增的值,默认为 1</p><p></li><li id="1RPMBQT3"></p><p id="1RPMBS">和定义序列值的最小值和最大值</p><p></li><li style="list-style: none; display: inline"><ul><li id="1RPMBQT4"></p><p id="1RPMBT">如果序列已经递增到最大值或最小值,则会根据你的设置进行循环或停止自增长。设置序列预读缓存数量。</p><p></li></ul></li><li id="1RPMBQT5"></p><p id="1RPMBU">表示循环序列</p><p></li><li id="1RPMBQT6"></p><p id="1RPMBV">则表示不循环序列</p><p></li></ul></p><p id="1RPMBQR0">通过 OB 官方文档操作,创建序列,实现表的列自增,示例如下:</p><p></p><p></p><p></p><p></p><p></p><p></p><p id="1RPMBQR6">2方法二:SEQUENCE + DDL</p><p id="1RPMBQR7">1、首先创建一个需要自增列的表。</p><p></p><p></p><p id="1RPMBQR9"></p><p id="1RPMBQRA">2、创建一个序列并更改表中列的 DEFAULT 属性为。</p><p></p><p></p><p></p><p id="1RPMBQRD"></p><p id="1RPMBQRE">此处为修改表中的值为序列的下一个值。具体而言,表示调用序列的函数,该函数返回序列的下一个值。因此,执行述语句后,当表中插入一行数据时,会自动为列赋值为序列的下一个值。</p><p id="1RPMBQRF">3、验证该方法是否达到自增列的效果。</p><p></p><p></p><p></p><p id="1RPMBQRI">3方法三:SEQUENCE + 触发器</p><p id="1RPMBQRJ">OB 延用 Oracle 中创建触发器的方法达到自增列的效果,具体步骤如下:</p><p id="1RPMBQRK">1、首先创建一个序列。</p><p></p><p id="1RPMBQRL">2、创建一个表。</p><p></p><p id="1RPMBQRM">3、创建一个触发器,在每次向表中插入行时,触发器将自动将新行的列设置为序列的下一个值。</p><p></p><p id="1RPMBQRN">该触发器在每次向表中插入行之前触发,通过将列设置为序列的下一个值。表示新插入行的列,是一个虚拟的表,用于生成一行数据用以存储序列的下一个值。</p><p id="1RPMBQRO">4、验证该方法是否达到自增列的效果。</p><p></p><p></p><p></p><p></p><p id="1RPMBQRS">4方法四:GENERATED BY DEFAULT AS IDENTITY 语法</p><p id="1RPMBQRT">1、在创建表时使用语法来创建自增长的列。</p><p></p><p></p><p id="1RPMBQRV"></p><p id="1RPMBQS0">2、验证该方法是否达到自增列的效果。</p><p></p><p></p><p></p><p></p><p id="1RPMBQS5">3、通过验证,使用可以非常简单地创建自增长列,无需使用其他手段,例如触发器。此方法不需要手动创建序列,会自动创建一个序列,在内部使用它来生成自增长列的值。</p><p></p><p id="1RPMBQS6">查看数据库对象视图,发现该方法通过创建对象内部命名方式为。</p><p id="1RPMBQS7">测试发现,关于序列对象的名称在OB中不论是通过自动创建,还是手动创建,都会占用中的位置,若删除序列或删除表,该对象名称也不会复用,只会单调递增。</p><p><blockquote id="1RPMBQTB">Tips: 在 Oracle 12c 及以上版本中,可以使用 GENERATED BY DEFAULT AS IDENTITY 关键字来创建自增长的列; 在 PostgreSQL 数据库中 GENERATED BY DEFAULT AS IDENTITY 也是适用的。</blockquote>3总结<ul><li id="1RPMBQT7"><br/></p><p id="1RPMBQS8">方法一(SEQUENCE + DML):也就是 OB 的官方文档中创建序列的操作,在每次做操作时需要指定自增列并加入,对业务不太友好,<strong>不推荐</strong>。</p><p><br/></li><li id="1RPMBQT8"><br/></p><p id="1RPMBQS9">方法二(SEQUENCE + DDL):相较于第一种该方法只需要指定 DDL 改写 DEFAULT 属性省去了 DML 的操作,但仍需再指定自己创建的序列名,每个表的序列名都不一致,管理不方便,<strong>不推荐</strong>。</p><p><br/></li><li id="1RPMBQT9"><br/></p><p id="1RPMBQSA">方法三(SEQUENCE + 触发器):延用 Oracle 的序列加触发器的方法,触发器会占用更多的计算资源和内存,对性能会有影响,因此也<strong>不推荐</strong>。</p><p><br/></li><li id="1RPMBQTA"><br/></p><p id="1RPMBQSB">方法四(语法):既方便运维人员管理,对业务也很友好,还不影响性能。<strong>强烈推荐!!!</strong></p><p><br/></li></ul></p><p id="1RPMBQSC">以上就是对 OBOracle 中如何创建自增列的几种方法的总结。有需要的小伙伴可以试试(●'◡'●)。</p>
讯享网

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/143385.html