作者:杨敬博
爱可生 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 设置序列预读缓存数量 。
- 如果序列已经递增到最大值或最小值,则会根据你的设置进行循环或停止自增长 。CACHE 设置序列预读缓存数量 。
- CYCLE 表示循环序列
- NOCYCLE 则表示不循环序列
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 |
推荐阅读
- 车臣到底是不是俄罗斯领土 车臣现在属于俄罗斯吗
- 船到桥头自然直下一句 船到桥头自然直19
- 2021年几月几号入伏到几号结束头伏饺子二伏面 2021年几月几号入伏到几号结束
- 李宗盛|离婚11年后,李宗盛娶小27岁美女:从少年到白头,我终于放下了你
- etc注销账户要到本地银行吗
- 湘西到底有没有僵尸??♀? 湘西到底有没有僵尸
- 怎么把文件刻录到光盘保存起来
- 怎么才能安慰自己
- 泸州老窖|重达几吨的翡翠原石,居然被1根细线切开!这是怎么做到的?
- 明星流量排行榜在哪里看的到