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 秒) |
向表中添加一列,显式插入新列,自动增加列将从当前最大值隐式增加。
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; p>
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,添加级联约束不会立即删除序列。
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 ---------- p> 3
SQL> select * from test2;
ID - --------- 1 2 4 3 p> SQL> 插入 test2 值('');
创建 1 行。
SQL>从test2中选择*;
ID ---------- 1 < p>24 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> 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如何实现自增列》一文全部内容,感谢您的阅读!相信大家都有一定的了解,希望分享的内容对大家有所帮助。如果您想了解更多知识,请关注行业资讯频道!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > Oracle12c中如何实现自增列