Oracle12c中如何实现自增列

分类:编程技术 时间:2024-02-20 15:51 浏览:0 评论:0
0
小编给大家分享一下Oracle12c中如何实现自增列。相信大多数人对此还不是很了解,所以分享这篇文章供大家参考。希望您读完这篇文章后能有所收获。我们一起去了解一下吧!

1. Mysql自增列

众所周知,mysql有自增列功能。

MySQL中的每张表只能有一个自增列,并且自增列必须是主键或唯一键。

mysql> 创建表 test2(id int not null auto_increment);

错误 1075 (42000):表定义不正确;只能有一个自动列,并且必须定义为键

mysql> create table test2(id int not null auto_increment Primary key);

查询正常,0行受影响(0.01秒)

Mysql插入空值,可以看到是允许的,会使用自增列值按定义自动插入。

mysql> 插入 test2 值();

查询正常,1 行受影响(0.01 秒)

mysql> select * from test2;

+---- +

| id |

+----+

| 1 |

+----+

组中 1 行(0.00 秒)

Mysql还允许插入的值不连续

mysql> insert into test2 values(3);

查询正常,1 行受影响(0.00 秒)

mysql> select * from test2;

+----+

| id |

+----+

| 1 |

| 3 |

+----+

集合中 2 行(0.00 秒)

向表中添加一列,显式插入新列,自动增加列将从当前最大值隐式增加。

< tr class="firstRow">< td>

mysql> 插入 test2(b) 值(4);

查询正常,1 行受影响(0.00 秒)

mysql > 从测试2中选择*;

+----+------+

|编号 | b |

+----+------+

| 1 |空|

| 3 |空|

| 4 | 4 |

+----+------+

一组 3 行(0.00 秒)

< /tbody>

2. Oracle自增列

在12c之前的Oracle版本中,自增列功能只能通过序列+触发器来实现。 12c版本终于来了,新增了这个功能。

自增列语法

创建表

SQL> 创建表 test1 (

2 id int 始终生成为 IDENTITY

3 );

< p>

表已创建。

SQL> desc test1

名称                                                                                                        ---------------- ---- ---- ----------------------------------------

IDNOT NULL NUMBER (38)

自动增加列将自动添加非空约束。

此时会自动生成一个序列

SQL> select SEQUENCE_NAME,MIN_VALUE,MAX_VALUE,INCREMENT_BY ,CACHE_SIZE 来自 dba_sequences,其中 SEQUENCE_OWNER='MING';

SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY CACHE_SIZE

------------- - ---------------- ---------- ---------- ------------ - - --------

ISEQ$$_45410 1.0000E+28 1 20

SQL> 设置第 150 行

SQL> 选择 TABLE_NAME,来自 dba_tab_columns 的 COLUMN_NAME、DATA_DEFAULT,其中 TABLE_NAME='TEST1' 且 COLUMN_NAME='ID';

TABLE_NAME                           nbsp; COLUMN_NAME DATA_DEFAULT

-------------------------------- --------- -------------------------- ------------------------ -- ---------------------

测试1“MING”.“ISEQ$$_45410”.nextval

注意以下两个动作

SQL> select ISEQ$$_45410.nextval from Dual;

NEXTVAL

---- ------

1

SQL> 从对偶中选择 ISEQ$$_45410.nextval;

NEXTVAL

----------

2

插入一个值

SQL>插入test1值(1);

插入 test1 值(1)

*

第 1 行出现错误:

ORA-32795:无法插入到生成的始终标识列

无法将值插入到自动增量列中。

SQL> alter table test1 add b int;

表已更改。

SQL> 插入 test1(b) 值(1);

创建 1 行。

< p>

SQL> select * from test1;

ID ---------

3 1< /p>

可以看到ID列插入了一个值。但它不是 1,而是 3。因为我有从之前的序列中手动选择值。

经过上面的实验,不难猜测下面的语句会报错

SQL> 插入 test1(id,b) 值(4,1);

插入 test1(id,b) 值(4,1)

      *

第 1 行出现错误:

ORA-32795:无法插入生成的始终标识列

更新和删除

SQL> update test1 set id=5;<​​/p>

update test1 set id=5< /p>

*

p>

第 1 行出现错误:

ORA-32796:无法更新生成的始终标识列

SQL> 从 test1 中删除;

删除 1 行。

SQL> 提交;

< p>

提交完成。

更新不可能,但删除可以。

可以使用default来引用

SQL> insert into test1 values(default,1);

1创建行。

SQL> select * from test1;

                                                                                                                                                                                         1

SQL> 提交;

提交完成。

生成的序列也可以被其他用户使用

SQL > insert into tx(a) values(ISEQ$ $_45410.nextval);

已创建 1 行。

SQL > 提交;

< /p>

提交完成。

此序列无法删除。

SQL> 删除序列 ming.ISEQ$$_45410;

删除序列 ming.ISEQ$$_45410

            *

第 1 行出现错误:

ORA-32794:无法删除系统生成的序列

< p>SQL> drop table test1;

表已删除。

SQL> select ISEQ$$_45410.nextval from dual;

NEXTVAL

------------

6

清除回收站后就会消失。

SQL> 清除回收站;

回收站已清除。

所以删除表时可以添加purge,添加级联约束不会立即删除序列。

Insert可以指定一个值,但是指定的值不会被序列识别。也就是说,如果手动插入值2,并且序列的下一个值是2,那么当这里插入null时,2就会被插入。而不是 3。

SQL> 创建表 test2 (

2 id int 默认生成为 NULL 作为 IDENTITY

3 );

已创建表。

SQL> insert into test2 values('');< /p>

已创建 1 行。

SQL> select * from test2;

< p>          ID

----------

           1

SQL> 插入 test2 值(4);

< p>

已创建 1 行。

SQL> 插入 test2 值(3);

已创建 1 行。

SQL> 提交;

提交完成。

SQL> 从对偶中选择 ISEQ$$_45418.nextval;

NEXTVAL

----------

3

SQL> select * from test2;

ID

- ---------

1

2

4

3

SQL> 插入 test2 值('');

创建 1 行。

SQL>从test2中选择*;

ID

----------

1

< p>2

4

3

4

下面的 Update 操作有点有趣。当前表中有两个ID=4的值。使用默认值更新时,使用序列分配不同的值。

SQL> 更新 test2 set id=default 其中e id=4;

更新了 2 行。

SQL> select * from test2;

ID

----------

1

2

5

3

6

现在我们知道创建了自动增量列使用序列,下面两个方法也是可以的

创建序列 ming$seq01 minvalue 1 maxvalue 9999999 从 1 递增 2 缓存开始20 nocycle;

创建表test3(id int default ming$seq01.nextval);

创建表test3(id号);

alter table test3修改id号default seq_1.nextval;

区别在于插入null时,不会变成一个数字,并且该列没有非空约束。

SQL> 插入 test3 值(null);

p>

已创建 1 行。

 

SQL> select * from test3;

ID

---------

p>

l Oracle自动递增列是使用序列完成的。自增列会自动添加非空约束;

l 当表被删除时,序列不会立即被删除。这是因为删除的表会进入回收站,需要purge来关联删除;

p>

l GENERATED ALWAYS AS IDENTITY可以删除,insert无法显示,update也无法显示;

l GENERATED BY DEFAULT ON NULL AS IDENTITY 会自动将空值插入到序列中的值中,并可以进行增删改查。 ,比GENERATED ALWAYS AS IDENTITY更灵活,但不能保证列的唯一性。

l 受自增列的启发,您可以创建自己的序列并将其指定为表列的默认值。

l 系统自创建序列的属性不可更改,可手动修改lly在创建自增列时。否则,缓存默认值会变小,从而导致性能问题。像这样:

CREATE TABLE test4 (id NUMBER GENERATED BY DEFAULT AS IDENTITY (START WITH 100 INCRMENT BY 10 cache 100));

l 如果其他用户想要向自增列插入数据,需要序列权限

以上是《Oracle12c如何实现自增列》一文全部内容,感谢您的阅读!相信大家都有一定的了解,希望分享的内容对大家有所帮助。如果您想了解更多知识,请关注行业资讯频道!

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > Oracle12c中如何实现自增列

用户评论