ORACLE 12C Identity Columns实现ORACLE自增长列

在ORACLE 12C以前的版本中,如果要实现列自增长,需要通过序列+触发器实现,到了12C ORACLE 引进了Identity Columns新特性,从而实现了列自增长功能,和mysql,sql server类似功能.
使用语法
ORACLE 12C IDENTITY
GENERATED ALWAYS AS IDENTITY方式测试
C:\Users\ffcheng>sqlplus chf/xifenfei@pdb
 
SQL*Plus: Release 12.1.0.2.0 Production on 星期二 3月 10 14:34:46 2015
 
Copyright (c) 1982, 2014, Oracle.  All rights reserved.
 
上次成功登录时间: 星期五 12月 19 2014 21:00:26 +08:00
 
连接到:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing opt
ions
 
XFF_PDB@CHF> select * from v$version;
 
BANNER                                                 CON_ID
-------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.          0
1.0.2.0 - 64bit Production
 
PL/SQL Release 12.1.0.2.0 - Production                      0
CORE    12.1.0.2.0      Production                          0
TNS for 64-bit Windows: Version 12.1.0.2.0 - Produ          0
ction
 
NLSRTL Version 12.1.0.2.0 - Production                      0
 
XFF_PDB@CHF>  create table t_xifenfei (id number GENERATED ALWAYS AS IDENTITY,na
me varchar2(100));
 
表已创建。
 
XFF_PDB@CHF> select object_name,object_type from user_objects;
 
OBJECT_NAME     OBJECT_TYPE
--------------- -----------------------
ISEQ$$_91982    SEQUENCE
T_XIFENFEI      TABLE
 
XFF_PDB@CHF> set long 10000
XFF_PDB@CHF> select dbms_metadata.get_ddl('TABLE','T_XIFENFEI') FROM DUAL;
 
DBMS_METADATA.GET_DDL('TABLE','T_XIFENFEI')
--------------------------------------------------------------------------------
  CREATE TABLE "CHF"."T_XIFENFEI"
   (    "ID" NUMBER GENERATED ALWAYS AS IDENTITY MINVALUE 1 MAXVALUE
   9999999999999999999999999999 INCREMENT BY 1 START WITH 1
   CACHE 20 NOORDER  NOCYCLE  NOT NULL ENABLE,
        "NAME" VARCHAR2(100)
   ) SEGMENT CREATION DEFERRED
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  TABLESPACE "INMEMORY"
 
XFF_PDB@CHF> INSERT INTO T_XIFENFEI VALUES(1,'WWW.XIFNEFEI.COM');
INSERT INTO T_XIFENFEI VALUES(1,'WWW.XIFNEFEI.COM')
*
第 1 行出现错误:
ORA-32795: 无法插入到“始终生成”身份列
 
 
XFF_PDB@CHF> INSERT INTO T_XIFENFEI(name) VALUES('WWW.XIFNEFEI.COM');
 
已创建 1 行。
 
XFF_PDB@CHF> INSERT INTO T_XIFENFEI(name) VALUES('WWW.orasos.COM');
 
已创建 1 行。
 
XFF_PDB@CHF> commit;
 
提交完成。
 
XFF_PDB@CHF> col name for a30
XFF_PDB@CHF> select * from t_xifenfei;
 
        ID NAME
---------- ------------------------------
         1 WWW.XIFNEFEI.COM
         2 WWW.orasos.COM
 
XFF_PDB@CHF> update t_xifenfei set id=3 where id=2;
update t_xifenfei set id=3 where id=2
                      *
第 1 行出现错误:
ORA-32796: 无法更新“始终生成”身份列
 
XFF_PDB@CHF> delete from t_xifenfei where id=1;
 
已删除 1 行。
 
XFF_PDB@CHF> commit;
 
提交完成。
 
XFF_PDB@CHF> select ISEQ$$_91982.nextval from dual;
 
   NEXTVAL
----------
         3
 
XFF_PDB@CHF> INSERT INTO T_XIFENFEI(name) VALUES('WWW.ORASOS.COM');
 
已创建 1 行。
 
XFF_PDB@CHF> commit;
 
提交完成。
 
XFF_PDB@CHF> select * from t_xifenfei;
 
        ID NAME
---------- ------------------------------
         2 WWW.orasos.COM
         4 WWW.ORASOS.COM
 
XFF_PDB@CHF> ALTER SESSION SET EVENTS ? TRACE NAME CONTEXT FOREVER, LEVEL 1
2'
 
会话已更改。
 
XFF_PDB@CHF>  select value from v$diag_info where name='Default Trace File'
 
VALUE
--------------------------------------------------------------------------------
 
D:\APP\FFCHENG\diag\rdbms\xff\xff\trace\xff_ora_10628.trc
 
XFF_PDB@CHF> INSERT INTO T_XIFENFEI(name) VALUES('WWW.111cn.net');
 
已创建 1 行。
 
XFF_PDB@CHF> COMMIT;
 
提交完成。
 
--跟踪trace文件
PARSING IN CURSOR #688719640 len=55 dep=0 uid=103 oct=2 lid=103 tim=15129490112 hv=961646460
ad=ƍff05d11a18' sqlid=དuzyjhwp33vw'
INSERT INTO T_XIFENFEI(name) VALUES('WWW.111cn.net')
END OF STMT
PARSE #688719640:c=15600,e=18909,p=0,cr=44,cu=0,mis=1,r=0,dep=0,og=1,plh=2541165129,tim=15129490112
EXEC #688719640:c=0,e=347,p=0,cr=1,cu=5,mis=0,r=1,dep=0,og=1,plh=2541165129,tim=15129490731
STAT #688719640 id=1 cnt=0 pid=0 pos=1 obj=0 op='LOAD TABLE CONVENTIONAL  T_XIFENFEI (cr=1 pr=0 pw=0 time=296 us)'
STAT #688719640 id=2 cnt=1 pid=1 pos=1 obj=91983 op='SEQUENCE  ISEQ$$_91982 (cr=0 pr=0 pw=0 time=89 us)'
WAIT #688719640: nam='SQL*Net message to client' ela= 2 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=15129490971
 
XFF_PDB@CHF> alter table t_xifenfei2 modify(id number GENERATED ALWAYS AS IDENTI
TY MINVALUE 1 MAXVALUE 99999999999999 INCREMENT BY 1 START WITH 1 CACHE  100);
 
表已更改。
 
XFF_PDB@CHF> drop sequence ISEQ$$_91982;
drop sequence ISEQ$$_91982
              *
第 1 行出现错误:
ORA-32794: 无法删除系统生成的序列
 
XFF_PDB@CHF> drop table t_xifenfei;
 
表已删除。
 
XFF_PDB@CHF> select object_name,object_type from user_objects where object_name=
'ISEQ$$_91982'
 
OBJECT_NAME          OBJECT_TYPE
-------------------- -----------------------
ISEQ$$_91982         SEQUENCE
 
XFF_PDB@CHF> select object_name,object_type from user_objects where object_name=
'ISEQ$$_91982'
 
OBJECT_NAME          OBJECT_TYPE
-------------------- -----------------------
ISEQ$$_91982         SEQUENCE
 
XFF_PDB@CHF> purge table t_xifenfei;
 
表已清除。
 
XFF_PDB@CHF> select object_name,object_type from user_objects where object_name=
'ISEQ$$_91982'
 
未选定行
这里的出来几个结论:
1. GENERATED ALWAYS AS IDENTITY 列无法人工指定值和修改该值
2. GENERATED IDENTITY 本质也是通过sequence实现
3. GENERATED IDENTITY 中sequence不能单独被删除
4. GENERATED IDENTITY 中的表删除,如果存在回收站中,该sequence依然存储,如果表被彻底删除,则sequence也被删除
5. GENERATED IDENTITY 中的sequence可以通过select 语句查询
6. 通过alert table 语句来修改GENERATED IDENTITY 的sequence相关值

GENERATED BY DEFAULT AS IDENTITY方式测试
XFF_PDB@CHF>  create table t_xifenfei2 (id number GENERATED BY DEFAULT AS IDENTI
TY,name varchar2(100)) tablespace users;
 
表已创建。
 
XFF_PDB@CHF> insert into t_xifenfei2 values (1,'www.111cn.net');
 
已创建 1 行。
 
XFF_PDB@CHF> insert into t_xifenfei2(name) values ('www.orasos.com');
 
已创建 1 行。
 
XFF_PDB@CHF> col name for a20
XFF_PDB@CHF> select * from t_xifenfei2;
 
        ID NAME
---------- --------------------
         1 www.111cn.net
         1 www.orasos.com
 
XFF_PDB@CHF> insert into t_xifenfei2 values (null,'www.111cn.net');
insert into t_xifenfei2 values (null,'www.111cn.net')
                                *
第 1 行出现错误:
ORA-01400: 无法将 NULL 插入 ("CHF"."T_XIFENFEI2"."ID")
 
 
XFF_PDB@CHF> desc t_xifenfei2
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ---------------------------
 
 ID                                        NOT NULL NUMBER
 NAME                                               VARCHAR2(100)
得出结论:
1. GENERATED BY DEFAULT AS IDENTITY方式不能在该列中插入null值
2. GENERATED BY DEFAULT AS IDENTITY方式可以指定具体值插入

GENERATED BY DEFAULT ON NULL AS IDENTITY方式测试
XFF_PDB@CHF>  create table t_xifenfei3 (id number GENERATED BY DEFAULT on null A
S IDENTITY,name varchar2(100)) tablespace users;
 
表已创建。
 
XFF_PDB@CHF> desc t_xifenfei3
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 
 ID                                        NOT NULL NUMBER
 NAME                                               VARCHAR2(100)
 
XFF_PDB@CHF> insert into t_xifenfei3 values (null,'www.111cn.net');
 
已创建 1 行。
 
XFF_PDB@CHF> select * from t_xifenfei3;
 
        ID NAME
---------- --------------------
         1 www.111cn.net
测试结论:GENERATED BY DEFAULT ON NULL AS IDENTITY的列上可以查询null值,只是默认转换为对应的sequence值

传统自增长列实现方法
XFF_PDB@CHF> create table t_xifenfei4 (id number,name varchar2(100)) tablespace
users;
 
表已创建。
 
XFF_PDB@CHF> create sequence xff_sequence
  2  increment by 1
  3  minvalue 1
  4  nomaxvalue
  5  start with 1
  6  cache 20
  7  order;
 
序列已创建。
 
XFF_PDB@CHF> create or replace trigger xifenfei_id
  2  before insert on t_xifenfei4
  3  for each row
  4  begin
  5  select xff_sequence.nextval into :new.id from dual;
  6  end;
  7  /
 
触发器已创建
 
XFF_PDB@CHF> insert into t_xifenfei4(name) values('www.111cn.net');
 
已创建 1 行。
 
XFF_PDB@CHF> select * from t_xifenfei4;
 
        ID NAME
---------- --------------------
         1 www.111cn.net

 

 

联系:手机(13429648788) QQ(107644445)
链接:http://www.xifenfei.com/5755.html
作者:惜分飞

时间: 2024-12-03 05:39:06

ORACLE 12C Identity Columns实现ORACLE自增长列的相关文章

[20130721]ORACLE 12C Invisible Columns.txt

[20130721]ORACLE 12C Invisible Columns.txt 在ORACLE 12C中有了Invisible Columns的概念,就是在表中真实的存在该列,但是通过设置Invisible可以实现不显示该列.自己测试看看. SQL> select banner from v$version ; BANNER -------------------------------------------------------------------------------- Or

[20130723]ORACLE 12C Invisible Columns的补充.txt

[20130723]ORACLE 12C Invisible Columns的补充.txt http://connormcdonald.wordpress.com/2013/07/22/12c-invisible-columns/ 正好看了以上链接,执行以上过程,可以调整显示顺序.记录一下. SQL> create or replace   2  procedure fix_cols(p_tname varchar2, p_col_list varchar2) is   3    l_col_l

Oracle 12C优化器的巨大变化,上生产必读(下)

在Oracle 12c数据库中,随着新的查询优化自适应方法的引入,还有对可用的统计信息的强化,优化器实现了一个巨大的飞跃.今天就让我们继续这个话题,一起来揭晓Oracle 12C其他的强大功能吧. 16 全局临时表上的会话级统计信息  全局临时表通常用于存储应用程序上下文中的中间结果.一个全局临时表的定义,是全系统中拥有适当权限的所有用户所共享的,但其数据永远是会话私有的.在全局临时表(必须是会话级临时表,PRESERVE ROWS ON COMMIT,提交时保留数据)上收集统计信息是行得通的:

ORACLE 12C PDB 维护基础知识介绍_oracle

先说基本用法: 先按11G之前进行 conn / as sysdba; create user test identifed by test; ORA-65096: 公用用户名或角色名无效. 查官方文档得知"试图创建一个通用用户,必需要用C##或者c##开头",这时候心里会有疑问,什么是common user?不管先建成功了再说 create C##user test identifed by test; 创建成功 SQL>show con_name; CON_NAME ----

Oracle 12c数据库优化器统计信息收集的最佳实践

Oracle 12c数据库优化器统计信息收集的最佳实践 转载自     沃趣科技(ID:woqutech)  作者         刘金龙(译) 原文链接   http://www.oracle.com/technetwork/database/bi-datawarehousing/twp-bp-for-stats-gather-12c-1967354.pdf 导  语 Oracle优化器会为SQL语句产生所有可能的访问路径(执行计划),然后从中选择一条COST值最低的执行路径,这个cost值是

BenchmarkSQL 测试Oracle 12c TPC-C 性能

使用BenchmarkSQL测试一下Oracle 12c的TPC-C性能,同时对比一下PostgreSQL 9.5的性能. 测试机: 3 * PCI-E SSD,逻辑卷条带,XFS,数据块对齐,16核开HT,256G内存. 12c安装,配置请参考 http://blog.163.com/digoal@126/blog/static/1638770402015112281556942/ http://blog.163.com/digoal@126/blog/static/1638770402015

《Oracle数据库管理与维护实战》——1.3 Oracle 12c新特性

1.3 Oracle 12c新特性 Oracle数据库管理与维护实战 纵观甲骨文全球大会和甲骨文公司的各种资讯,我们可以发现云计算和大数据是两个重要的主题,Oracle 12c则融合了这两大主题.与以往的Oracle数据库相比,Oracle 12c在16个方面进行了更新.本节将详细介绍Oracle 12c数据库中的16个新特性. 1.3.1 支持多线程模式 在Oracle 12c中,Oracle引入了多线程模式,允许在Windows平台之外的UNIX.Linux等系统使用多线程模式.结合多进程与

CentOS命令行下装oracle 12c的方法(命令行模式安装)_oracle

实验环境: 1:安装oracle所需软件包 Oracle 12c所需的rpm包如下: binutils-2.20.51.0.2-5.11.el6 (x86_64) compat-libcap1-1.10-1 (x86_64) compat-libstdc++-33-3.2.3-69.el6 (x86_64) compat-libstdc++-33-3.2.3-69.el6 (i686) gcc-4.4.4-13.el6 (x86_64) gcc-c++-4.4.4-13.el6 (x86_64)

In Memory—Oracle 12C重要新特性IMO详解

IMO,即In-Memory Option.为Oracle 12c中最为重要的新特性之一.12.1开始支持该新特性. 目录 基本介绍 可以启用In-Memory列存储功能的级别 适合使用IMO功能的操作类型 可以使用INMEMORY子句的命令 查询数据库中哪些segment启用了IM 不适合使用IM的操作 数据压缩 IM的存储设置 与IMO相关的初始化参数 在表,表空间,或者物化视图上启用IM 与IM相关的等待事件 与IM相关的统计信息 一.基本介绍 In-Memory列存储组件,为12c 中S