从MySQL到OBOracle:如何处理自增列?

作者:杨敬博
爱可生 DBA 团队成员,一位会摄影、会铲屎、会打球、会骑车、生活可以自理的 DBA 。
* 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源 。
1背景描述
OceanBase 数据库中分为 MySQL 租户与 Oracle 租户,本文针对 OceanBase 中 Oracle 租户怎样创建自增列,以及如何更简单方便的处理自增列的问题展开介绍 。OceanBase 的 Oracle 租户以下简称: OBOracle 。
发现问题场景
业务需要将数据库转换为 OceanBase 数据库,但源端涉及到 Oracle 及 MySQL 两种不同数据库,需要合并为 OceanBase 中单一的 Oracle 模式,其中源端 MySQL 数据库需要改造为 OBOracle 并做异构数据迁移 。
在数据迁移中发现,MySQL 中的自 增列(AUTO_INCREMENT )在 OBOracle 中是不支持的,在 OBOracle 对应 MySQL 自增列的功能是通过序列实现的 。通过测试以及阅读相关文章,共测试完成了以下四种 OBOracle 创建并使用序列的方法 。
2四种 OBOracle 创建序列方法1方法一:SEQUENCE + DML
在 OceanBase 中 Oracle 数据库,我们可以通过以下语法创建序列:
CREATESEQUENCEsequence_name
[
MINVALUEvalue-- 序列最小值
MAXVALUE value-- 序列最大值
STARTWITHvalue-- 序列起始值
INCREMENTBYvalue-- 序列增长值
CACHEcache-- 序列缓存个数
CYCLE| NOCYCLE-- 序列循环或不循环
]
语法解释:

  • sequence_name 是要创建的序列名称
  • START WITH 指定使用该序列时要返回的第一个值,默认为 1
  • INCREMENT BY 指定序列每次递增的值,默认为 1
  • MINVALUE 和 MAXVALUE 定义序列值的最小值和最大值
    • 如果序列已经递增到最大值或最小值,则会根据你的设置进行循环或停止自增长 。CACHE 设置序列预读缓存数量 。
  • CYCLE 表示循环序列
  • NOCYCLE 则表示不循环序列
通过 OB 官方文档操作,创建序列,实现表的列自增,示例如下:
obclient [oboracle]> CREATETABLEtest(
-> IDNUMBERNOTNULLPRIMARY KEY,
-> NAMEVARCHAR2( 480),
-> AGE NUMBER( 10, 0)
-> );
Query OK, 0 rows affected (0.116 sec)
obclient [oboracle]> CREATESEQUENCEseq_test STARTWITH100INCREMENTBY1;
Query OK, 0 rows affected (0.026 sec)
obclient [oboracle]> INSERTINTOtest( ID, NAME,AGE) VALUES(seq_test.nextval, 'A', 18);
Query OK, 1 row affected (0.035 sec)
obclient [oboracle]> INSERTINTOtest( ID, NAME,AGE) VALUES(seq_test.nextval, 'B', 19);
Query OK, 1 row affected (0.001 sec)
obclient [oboracle]> INSERTINTOtest( ID, NAME,AGE) VALUES(seq_test.nextval, 'C', 20);
Query OK, 1 row affected (0.001 sec)
obclient [oboracle]> select* fromtest;
+ -----+------+------+
| ID | NAME | AGE |
+ -----+------+------+
| 100 | A | 18 |
| 101 | B | 19 |
| 102 | C | 20 |
+ -----+------+------+
3 rows in set( 0.006sec)
2方法二:SEQUENCE + DDL
1、首先创建一个需要自增列的表 。
obclient [oboracle]> CREATETABLEAtable (
-> IDNUMBER( 10, 0),
-> NAMEVARCHAR2( 480),
-> AGE NUMBER( 10, 0),
-> PRIMARY KEY( id)
-> );
Query OK, 0 rows affected (0.105 sec)
obclient [oboracle]> desc Atable;
+ -------+---------------+------+-----+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+ -------+---------------+------+-----+---------+-------+
| ID | NUMBER(10) | NO | PRI | NULL | NULL |
| NAME | VARCHAR2(480) | YES | NULL | NULL | NULL |
| AGE | NUMBER(10) | YES | NULL | NULL | NULL |
+ -------+---------------+------+-----+---------+-------+
3 rows in set( 0.037sec)
2、创建一个序列并更改表中 ID 列的 DEFAULT 属性为 sequence_name.nextval。
obclient [oboracle]> CREATESEQUENCEA_seq
-> MINVALUE1
-> MAXVALUE 999999
-> STARTWITH10
-> INCREMENTBY1;
Query OK, 0 rows affected (0.022 sec)
obclient [oboracle]> ALTERTABLEAtable MODIFYidDEFAULTA_seq.nextval;
Query OK, 0 rows affected (0.065 sec)
obclient [oboracle]> desc Atable;
+ -------+---------------+------+-----+-------------------+-------+
【从MySQL到OBOracle:如何处理自增列?】| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |


推荐阅读