搜尋
首頁資料庫mysql教程Oracle 12c学习系列之—identity column

本站文章除注明转载外,均为本站原创: 转载自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 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 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.com
SQL>
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.com
SQL>  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 column
SQL> 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 column
SQL> 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".nextval
TEST1                ID                   YES YES "ROGER"."ISEQ$$_91822".nextval
TEST2                ID                   NO  YES "ROGER"."ISEQ$$_91824".nextval
SQL> 
SQL> set pagesize 200 long 9999
SQL> 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 9999999999
999999999999999999 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"
SQL> 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 99
99999999999999999999999999 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:

  1. about partiton column with date or varchar2?
Oracle 12c学习系列之—identity column 本站文章除注明转载外,均为本站原创: 转载自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 [...]Oracle 12c学习系列之—identity column
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
什么是oracle asm什么是oracle asmApr 18, 2022 pm 04:16 PM

oracle asm指的是“自动存储管理”,是一种卷管理器,可自动管理磁盘组并提供有效的数据冗余功能;它是做为单独的Oracle实例实施和部署。asm的优势:1、配置简单、可最大化推动数据库合并的存储资源利用;2、支持BIGFILE文件等。

oracle怎么查询所有索引oracle怎么查询所有索引May 13, 2022 pm 05:23 PM

方法:1、利用“select*from user_indexes where table_name=表名”语句查询表中索引;2、利用“select*from all_indexes where table_name=表名”语句查询所有索引。

oracle全角怎么转半角oracle全角怎么转半角May 13, 2022 pm 03:21 PM

在oracle中,可以利用“TO_SINGLE_BYTE(String)”将全角转换为半角;“TO_SINGLE_BYTE”函数可以将参数中所有多字节字符都替换为等价的单字节字符,只有当数据库字符集同时包含多字节和单字节字符的时候有效。

Oracle怎么查询端口号Oracle怎么查询端口号May 13, 2022 am 10:10 AM

在Oracle中,可利用lsnrctl命令查询端口号,该命令是Oracle的监听命令;在启动、关闭或重启oracle监听器之前可使用该命令检查oracle监听器的状态,语法为“lsnrctl status”,结果PORT后的内容就是端口号。

oracle怎么删除sequenceoracle怎么删除sequenceMay 13, 2022 pm 03:35 PM

在oracle中,可以利用“drop sequence sequence名”来删除sequence;sequence是自动增加数字序列的意思,也就是序列号,序列号自动增加不能重置,因此需要利用drop sequence语句来删除序列。

oracle怎么查询数据类型oracle怎么查询数据类型May 13, 2022 pm 04:19 PM

在oracle中,可以利用“select ... From all_tab_columns where table_name=upper('表名') AND owner=upper('数据库登录用户名');”语句查询数据库表的数据类型。

oracle查询怎么不区分大小写oracle查询怎么不区分大小写May 10, 2022 pm 05:45 PM

方法:1、利用“LOWER(字段值)”将字段转为小写,或者利用“UPPER(字段值)”将字段转为大写;2、利用“REGEXP_LIKE(字符串,正则表达式,'i')”,当参数设置为“i”时,说明进行匹配不区分大小写。

Oracle怎么修改sessionOracle怎么修改sessionMay 13, 2022 pm 05:06 PM

方法:1、利用“alter system set sessions=修改后的数值 scope=spfile”语句修改session参数;2、修改参数之后利用“shutdown immediate – startup”语句重启服务器即可生效。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
1 個月前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境