【OceanBase专栏】OB不同模式自增的实现

Oracle && OceanBase 相关文档,希望互相学习,共同进步

风123456789~-CSDN博客 >> OB知识经验


1.背景

OceanBase 数据库不同模式下,自增字段的实现。本文分别介绍了OceanBase 的MySQL 和Oracle 两种模式下--自增字段的实现,希望对各位有所帮助。

2. 实验

2.1 实验:mysql模式下 自增字段

1)创建表

复制代码
obclient -h192.168.3.14 -P2881  -uroot@sys -p'xxx'

show databases;

use fengmysql


-- 创建表时定义自增列(默认 ORDER 模式)
CREATE TABLE t_user (
  id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50)
) AUTO_INCREMENT = 1;

-- 显式指定 NOORDER 模式
CREATE TABLE t_order (
  id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  order_no VARCHAR(20)
) AUTO_INCREMENT_MODE = 'NOORDER';

执行截图:

此时,已创建 t_user,t_order 两张表

2)插入实验

复制代码
INSERT INTO t_user (name) VALUES ('A'),('B'),('C');

select * from t_user;

commit;

-------
INSERT INTO t_order (order_no)  VALUES('order1'),('order2'),('order3');

select * from t_order ;
commit;

截图:

发现,都从1开始增长。再插入不同的条数,观察:

3)再插入不同条数

复制代码
INSERT INTO t_order (order_no)  VALUES('ord1'),('ord2');

INSERT INTO t_user (name) VALUES ('Ad');

select * from t_user;

select * from t_order;

commit;

截图:

4)删除某行,看是否连续

复制代码
delete from t_order where id=5;

commit;

select * from t_order;

--删除后,再插入1条
insert into t_order(order_no) values(222);
commit;

select * from t_order;


--再插入2条
INSERT INTO t_order (order_no)  VALUES('ord2'),('ord4');
select * from t_order;

截图:

看到删除的那条就没有了,序号依次往下排,从6开始。

5)truncate 再观察 1开始

复制代码
truncate table t_order;

insert into t_order(order_no) values('new1'),('new2');

commit;

select * from t_order;

截图:

发现 truncate 表之后,自增序列重新开始。

2.2 实验:oracle模式下 自增序列

1)切换背景

oracle 数据库中建表t_log, 可以实现自增模式:

复制代码
create table T_LOG
(
  logid         NUMBER generated always as identity (start with 1 maxvalue 9999999999999 cycle order),
  message       VARCHAR2(400)
)

如何切换oceanbase数据库呢?

2)oracle的语法测试

复制代码
obclient -h192.168.3.14 -P2881 -ufeng@fengoracle -p'xxx' 

select user_name from user_tables;

create table T_LOG
(
  logid         NUMBER generated always as identity (start with 1 maxvalue 9999999999999 cycle order),
  message       VARCHAR2(400)
);

---改为 ok
create table T_LOG (   logid  NUMBER ,   message       VARCHAR2(400) );  

截图:发现 直接用oracle创建语句,不可以

3)测试 auto_increment, 不可

复制代码
create table T_LOG1 (
logid  NUMBER not null AUTO_INCREMENT, 
message  VARCHAR2(400) 
); 

截图:发现提示有语法错误

4)采用序列方式 +DML

经过测试,可以。之前文章讲过,详见 【Oceanbase专栏】OB 与 Oracle 对比实验

复制代码
CREATE SEQUENCE sequence_name
    [
        MINVALUE value -- 序列最小值
        MAXVALUE value -- 序列最大值
        START WITH value -- 序列起始值
        INCREMENT BY value -- 序列增长值
        CACHE cache -- 序列缓存个数
        CYCLE | NOCYCLE -- 序列循环或不循环
    ]

--语句
CREATE TABLE T_SEQ(
ID NUMBER NOT NULL PRIMARY KEY, 
NAME VARCHAR2(400));

CREATE SEQUENCE seq_t_seq START WITH 1 INCREMENT BY 1;

insert into t_seq(id,name) values(seq_t_seq.nextval,'xiaohua'),(seq_t_seq.nextval,'xiaoming');

截图:

5)类oracle自增方式 generated by default

复制代码
--oracle下:
create table T_LOG
(
  logid         NUMBER generated always as identity (start with 1 maxvalue 9999999999999 cycle order),
  message       VARCHAR2(400)
)

--oceanbase oracle模式下:
create table T_LOG(
id number generated by default as identity  maxvalue 21 start with 1 cycle order,
name varchar2(400)
);

截图: ok 创建成功。

注意:如果设置cycle 循环,且没有指定 cache 则maxvalue 必须大于一个 one cycle 默认20

否则 提示 OBE-04013: number to CACHE must be less than one cycle

指定cache也可以,建表语句修改如下:

复制代码
CREATE SEQUENCE seq1 START WITH 1 MINVALUE 1 MAXVALUE 5 INCREMENT BY 2 CYCLE CACHE 2;

--oceanbase oracle模式下:
create table T_LOG1(
id number generated by default as identity  maxvalue 4 start with 1 cycle order cache 3,
name varchar2(400)
);

截图: generated by default as identity maxvalue x start with 1 cycle order cache 3

插入t_log1 (最大4,循环)

复制代码
insert into t_log1(name) values('hello1'),('hello3'),('hello4'),('hello_hell');

insert into t_log1(name) values('oo1'),('oo2'),('003'),('oo4');

select * from t_log1;

截图:

发现id自增,且循环。ok

6)创建表时 字段默认序列

创建表,字段默认值为序列的值

或者

后面改为默认值为序列值也可以

复制代码
create table t_log3(
id number default seq_t_seq.nextval,
name varchar2(400)
);

insert into t_log3(name) values('小花'),('小孩'),('小东');

或者:
create table t_log2(id number,name varchar2(400));

alter table t_log2 modify id DEFAULT  seq_t_seq.nextval;

insert into t_log2(name) values('小花2'),('小孩2'),('小东2');

截图:

实验发现,OceanBase 字段默认是序列,也可以实现自增。

实验验证:ok

就到这里吧,感谢各位看到这里!欢迎点赞、收藏,共同探讨、共同成长!!


OB 经验知识 相关文章:

【OceanBase专栏】OB背景知识

【OceanBase专栏】select..into OUTFILE

【OceanBase专栏】OceanBase 外部表实验

【Oceanbase专栏】OB 与 Oracle 对比实验

【OceanBase专栏】OB租户-创建实验

【OceanBase专栏】SECURE_FILE_PRIV 设置报错解决

项目管理--相关知识

项目管理-项目绩效域1/2-CSDN博客

项目管理-项目绩效域1/2_八大绩效域和十大管理有什么联系-CSDN博客

项目管理-项目绩效域2/2_绩效域 团不策划-CSDN博客

高项-案例分析万能答案(作业分享)-CSDN博客

项目管理-计算题公式【复习】_项目管理进度计算题公式:乐观-CSDN博客

项目管理-配置管理与变更-CSDN博客

项目管理-项目管理科学基础-CSDN博客

项目管理-高级项目管理-CSDN博客

项目管理-相关知识(组织通用治理、组织通用管理、法律法规与标准规范)-CSDN博客


Oracle其他文档,希望互相学习,共同进步

Oracle-找回误删的表数据(LogMiner 挖掘日志)_oracle日志挖掘恢复数据-CSDN博客

oracle 跟踪文件--审计日志_oracle审计日志-CSDN博客

ORA-12899报错,遇到数据表某字段长度奇怪现象:"Oracle字符型,长度50"但length查却没有50_varchar(50) oracle 超出截断-CSDN博客

EXP-00091: Exporting questionable statistics.解决方案-CSDN博客

Oracle 更换监听端口-CSDN博客

相关推荐
汝生淮南吾在北1 小时前
SpringBoot+Vue在线笔记管理系统
java·vue.js·spring boot·笔记·毕业设计·毕设
逗豆逗1 小时前
数字IC设计工程师的testbench.v文件和UVM环境
笔记·芯片设计
摇滚侠1 小时前
零基础小白自学 Git_Github 教程,git 命令行操作1,笔记18
笔记·git·github
AA陈超1 小时前
LyraRPG:001.创建RPGCore插件
c++·笔记·学习·ue5·虚幻引擎·lyra
汇能感知2 小时前
摄像头模块在厨电领域的深度应用
经验分享·笔记·科技
weixin_436525072 小时前
jar包启动使用logs替换nohup日志文件
java·linux·数据库
7***99872 小时前
Redis——Windows安装
数据库·windows·redis
AA陈超2 小时前
Lyra学习6:GameFeatureAction_AddComponents分析
c++·笔记·学习·ue5
离离茶2 小时前
【笔记2-8】ESP32:SmartConfig一键配网
笔记