本站文章除注明转载外,均为本站原创: 转载自love wife love life —roger 的oracle技术博客 本文链接地址: oracle 12c学习系列之identity column 在12c之前,如果想实现column的自动增长,通常是通过sequence来实现,然而这个问题在12c中得到了解决,oracl
本站文章除注明转载外,均为本站原创: 转载自love wife & love life —roger 的oracle技术博客
本文链接地址: oracle 12c学习系列之—identity column
在12c之前,如果想实现column的自动增长,通常是通过sequence来实现,然而这个问题在12c中得到了解决,oracle推迟了identity column功能,该功能完美的解决了之前的问题,下面是我的简单测试,供参考!
sql> alter pluggable database all open;pluggable database altered.sql> select name,open_mode from v$pdbs;name open_mode------------------------------ ----------pdb$seed read onlypdborcl read writesql> conn roger/roger@pdborclconnected.sql> show con_namecon_name------------------------------pdborclsql> create table test(id number generated by default as identity , 2 name varchar2(20));table created.sql> insert into test(name) values('roger');1 row created.sql> insert into test(name) values('killdb.com');1 row created.sql> commit;commit complete.sql> select * from test; id name---------- -------------------- 1 roger 2 killdb.comsql>sql> insert into test(id,name) values(null,'killdb.com');insert into test(id,name) values(null,'killdb.com') *error at line 1:ora-01400: cannot insert null into (roger.test.id)
可以看到id列默认可以进行自动增长,在12c之前,oracle只能通过sequence来实现这个功能。 另外我们还可以看到,这种情况下,是不能插入null值的。
sql> alter table test modify (id default null); alter table test modify (id default null) *error at line 1:ora-30674: identity column cannot have a default value
那么对于identity 的column,真的不能插入null值吗? 其实是可以的,不过你得这样做:
sql> create table test1 (id number generated by default on null as identity ,name varchar2(20));table created.sql>sql> insert into test1 values(1,'killdb.com');1 row created.sql> insert into test1 values(2,'baidu.com');1 row created.sql> insert into test1 values(null,'google.com');1 row created.sql> commit;commit complete.sql> select * from test1; id name---------- -------------------- 1 killdb.com 2 baidu.com 1 google.com
不过比较奇怪的是,大家看到了,插入的第3条数据的id列为null的情况下,oracle自己实际的值为1.?这个1是怎么来的呢 ?后面会告诉你答案。
sql> update test1 set id=100 where id=2;1 row updated.sql> commit;commit complete.sql> select * from test1; id name---------- -------------------- 1 killdb.com 100 baidu.com 1 google.com
这种情况下,可以进行正常的dml,因为identity column默认是为null的,下面继续一个测试。
sql> create table test2 (id number generated always as identity ,name varchar2(20));table created.sql> insert into test2(name) values('killdb.com');1 row created.sql> insert into test2(name) values('baidu.com');1 row created.sql> insert into test2(name) values('google.com');1 row created.sql> commit;commit complete.sql> select * from test2; id name---------- -------------------- 1 killdb.com 2 baidu.com 3 google.comsql> update test2 set id=4 where id=2; update test2 set id=4 where id=2 *error at line 1:ora-32796: cannot update a generated always identity columnsql> update test2 set id=1 where id=2;update test2 set id=1 where id=2 *error at line 1:ora-32796: cannot update a generated always identity columnsql> delete from test2 where id=2;1 row deleted.sql> commit;commit complete.sql> select * from test2; id name---------- -------------------- 1 killdb.com 3 google.com
我们可以看到,居然不能进行update,这里想想也应该知道,oracle是不会允许你进行update的。
sql>sql> select table_name, 2 column_name, 3 default_on_null, 4 identity_column, 5 data_default 6 from user_tab_columns 7 where identity_column='yes';table_name column_name def ide data_default-------------------- -------------------- --- --- ------------------------------------------------------------test id no yes roger.iseq$$_91820.nextvaltest1 id yes yes roger.iseq$$_91822.nextvaltest2 id no yes roger.iseq$$_91824.nextvalsql> sql> set pagesize 200 long 9999sql> select dbms_metadata.get_ddl('table','test') from dual;dbms_metadata.get_ddl('table','test')-------------------------------------------------------------------------------- create table roger.test ( id number generated by default as identity minvalue 1 maxvalue 9999999999999999999999999999 increment by 1 start with 1 cache 20 noorder nocycle not null enable, name varchar2(20) ) segment creation immediate pctfree 10 pctused 40 initrans 1 maxtrans 255 nocompress logging storage(initial 65536 next 1048576 minextents 1 maxextents 2147483645 pctincrease 0 freelists 1 freelist groups 1 buffer_pool default flash_cache default cell_flash_cache default) tablespace userssql> select dbms_metadata.get_ddl('table','test1') from dual;dbms_metadata.get_ddl('table','test1')-------------------------------------------------------------------------------- create table roger.test1 ( id number generated by default on null as identity minvalue 1 maxvalue 9999999999999999999999999999 increment by 1 start with 1 cache 20 noorder nocycle not null enable, name varchar2(20) ) segment creation immediate pctfree 10 pctused 40 initrans 1 maxtrans 255 nocompress logging storage(initial 65536 next 1048576 minextents 1 maxextents 2147483645 pctincrease 0 freelists 1 freelist groups 1 buffer_pool default flash_cache default cell_flash_cache default) tablespace users
最后通过表的定义,我们可以看到,id列默认被定义为了sequence,从属性来看跟我们之前版本中创建sequence的属性差不多。而且我们看到默认情况下start with 为1。这个也就是为什么前面插入null的情况下id=1的原因。
related posts:
about partiton column with date or varchar2?本站文章除注明转载外,均为本站原创: 转载自love wife & love life —roger 的oracle技术博客 本文链接地址: oracle 12c学习系列之—identity column 在12c之前,如果想实现column的自动增长,通常是通过sequence来实现,然而这个问题在12c中得到了解决,oracle推迟了identity column功能,该功能完美的解决了之前的问题,下面是我的简单测试,供参考! sql> alter pluggable database all open; pluggable database altered. sql> select name,open_mode from v$pdbs; name open_mode ------------------------------ ---------- pdb$seed read only pdborcl read write sql> conn roger/roger@pdborcl connected. sql> show con_name con_name ------------------------------ pdborcl sql> create table test(id number generated by [...]