Oracle 12c identity

在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/[email protected]
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的原因。

时间: 2024-10-15 08:49:12

Oracle 12c identity的相关文章

【翻译自mos文章】将Oracle 12c数据库从标准版convert到企业版

将Oracle 12c数据库从标准版convert到企业版 来源于: How to Convert Oracle Database 12c from Standard to Enterprise Edition ? (文档 ID 2046103.1) APPLIES TO: Oracle Database - Enterprise Edition - Version 12.1.0.1 and later Information in this document applies to any pl

centos6.7安装oracle 12c r1 (一)

昨天刚接到同事电话领导让安装部署一个oracle12c 他们都不知道c是什么意思还让安装,悲催没办法,谁让咱是技术呢,就是解决技术问题的,废话不多说,下面是我安装的记录: 一. 安装centos系统我就不介绍了网上有很多. 二. 配置yun源安装oracle需要的包. http://public-yum.oracle.com/getting-started.html  这里写的很清楚,配置好yum后安装一个包 oracle-rdbms-server-12cR1-preinstall,这是一 个o

Kettle连接Oracle 12c

安装Oracle我用的是Win10 64位,官网下载64位 Oracle 12c,两个文件.解压第一个文件之后安装,但是安装到一半错误,提示缺失文件.后来发现原来两个文件要单独解压,解压后根据目录合并在一起.再次安装,安装到88%卡住不动了.我以为安装又失败了,就关了,但是发现可以用,就这么用吧. 创建用户Oracle数据库分为CDB和PDB,他们之间的关系,想了解可以查相关资料,不在此详述.简单来说CDB是一个数据库容器,PDB是可插拔数据库.默认登陆为CDB,只能创建COMMON用户.COM

Oracle 12c 添加scott用户

对于熟悉Oracle或者接触过Oracle的人,scott这个用户大家一定相当的熟悉.12c推出了可插拔数据库,在一个容器cdb中以多租户的形式同时存在多个数据库pdb.pdb中默认不包含scott用户. 为了做数据泵的实验,需要一个测试用户,因此需要在pdb中添加scott用户. oracle 12c自带了scott的脚本,$ORACLE_HOME/rdbms/admin/utlsampl.sql 内容如下: Rem Copyright (c) 1990, 2006, Oracle. All

如何在oracle 12c中创建普通用户

-------如何在oracle 12c中创建普通用户------- [[email protected] ~]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.2.0 Production on Sun Nov 29 21:43:50 2015 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edit

oracle 12c grid db 安装的的checklist

oracle 12c 安装 checklist 关闭 iptables NetworkManager selinux service iptables stop chkconfig iptables off service NetworkManager stop chkconfig NetworkManager off 修改/etc/selinux/config 文件 将SELINUX=enforcing改为SELINUX=disabled 重启机器即可 创建oracle用户 groupadd

WIN7上安装Oracle 12c图解

环境: WIN7 64位+ Oracle 12c(12.1.0.2.0) 方式: 图形化安装 以管理员登录系统: 1 双击database目录下的setup.exe 去掉"接收安全更新"的勾,点下一步. 2 等待一段时间后出现 我这里出现了错误INS-30131: 如下图,启动Server服务后正常: 3. 5. 6. 7. 8. 9.注意这里设置的密码最好满足Oracle的密码复杂性策略(即有大写和小写字符.数字,且大于8位),否则后面的监听配置可能会出现问题,而且这里一般建议选择&

Oracle 12c新特性对于业务上的一些影响总结

1.不可见字段 在Oracle 11g R1中,Oracle以不可见索引和虚拟字段的形式引入了一些不错的增强特性.继承前者并发扬光大,Oracle 12c R1中引入了不可见字段思想.在之前的版本中,为了隐藏重要的数据字段以避免在通用查询中显示,我们往往会创建一个视图来隐藏所需信息或应用某些安全条件. 在12c R1中,你可以在表中创建不可见字段.当一个字段定义为不可见时,这一字段就不会出现在通用查询中,除非在SQL语句或条件中有显式的提及这一字段,或是在表定义中有DESCRIBED.要添加或是

ORACLE 12C PDB 维护基础介绍

CDB和PDB是ORACLE 12C一个很亮的新特性,由于他们的引入导致传统的ORACLE数据库管理理念不少发生了改变,这里列举了部分最基本的cdb和pdb管理方式 cdb和pdb关系图 ORACLE 12C版本 SQL> select * from v$version; BANNER CON_ID -------------------------------------------------------------------------------- ---------- Oracle