[20130803]12C在表中使用sequence.txt

[20130803]12C在表中使用sequence.txt

记得以前学习数据库的时候,第1个接触的数据库是informix,里面可以在表上定义顺序号,这样在插入时无需指定,
保证唯一。(也许记忆有错,毕竟很久没使用它了)。oracle 12c开始支持这种特性,我的感觉这些主要为了别的
数据库移植到oracle上来。

做一个测试看看:

SQL> @ver

BANNER                                                                               CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

create table t
(
id number GENERATED ALWAYS as identity ( start with 1 increment by 1),
name varchar2(10)
);

开始测试:
SQL> insert into t values(1,'a');
insert into t values(1,'a')
*
ERROR at line 1:
ORA-32795: cannot insert into a generated always identity column

SQL> insert into t (name) values('a');
1 row created.
SQL> commit ;
Commit complete.
--无法指定ID的值。

SQL> select * from t;
        ID NAME
---------- --------------------
         1 a

SQL> update t set id=2 where id=1;
update t set id=2 where id=1
             *
ERROR at line 1:
ORA-32796: cannot update a generated always identity column

--也不能修改。

SQL> insert into t (name) values('b');
1 row created.

SQL> commit ;
Commit complete.

SQL> select * from t;
        ID NAME
---------- --------------------
         1 a
         2 b
SQL> SELECT DBMS_METADATA.get_ddl ('TABLE', 'T')  FROM DUAL;
DBMS_METADATA.GET_DDL('TABLE','T')
----------------------------------------------------------------------------------------------------------------------------------------------------------------
  CREATE TABLE "SCOTT"."T"
   (    "ID" NUMBER GENERATED ALWAYS AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE  NOT NULL E
NABLE,
        "NAME" VARCHAR2(10)
   ) 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"

--相当于内嵌了一个seq的定义。

SQL> column sequence_name format a20
SQL> select * from USER_SEQUENCES;
SEQUENCE_NAME         MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER PARTITION_COUNT S K
-------------------- ---------- ---------- ------------ - - ---------- ----------- --------------- - -
ISEQ$$_92784                  1 1.0000E+28            1 N N         20          21                 N N

--我当前用户并没有定义SEQUENCE,可以确定这个就是表T里面的。猜测一下92784应该对应的object_id.

SQL> select object_id,data_object_id from dba_objects where wner=user and object_name='T';
 OBJECT_ID DATA_OBJECT_ID
---------- --------------
     92784          92784

--正好对上。

SQL> select data_default from dba_tab_cols where wner=user and table_name='T' and column_name='ID';
DATA_DEFAULT
------------------------------
"SCOTT"."ISEQ$$_92784".nextval

--这样就很清楚了,ID的缺省值就是等于"SCOTT"."ISEQ$$_92784".nextval,通过这个方式获取下一个值。

--继续测试

SQL> select "ISEQ$$_92784".nextval from dual ;
   NEXTVAL
----------
         3

SQL> insert into t (name) values('c');
1 row created.

SQL> commit ;
Commit complete.

SQL> select * from t ;
        ID NAME
---------- --------------------
         1 a
         2 b
         4 c

--可以发现跳过了3.另外这些信息的获得使用10046跟踪就可以了。

--补充1点,这样的话建立seq1号,然后定义缺省值为seq1.nextval应该也可以,测试看看。

SQL> CREATE SEQUENCE SCOTT.seq1 START WITH 10 INCREMENT BY 1 MINVALUE 10 CACHE 100 NOCYCLE ORDER ;
Sequence created.

SQL> CREATE TABLE T1
(
  ID    NUMBER  DEFAULT seq1.nextval NOT NULL,
  NAME  VARCHAR2(10 BYTE)
);

SQL> insert into t1 (name) values ('aaa');

1 row created.

SQL> select * from t1;
        ID NAME
---------- --------------------
        10 aaa

--如果sequence改名或者删除,插入DML就无法执行。

时间: 2024-10-04 02:49:42

[20130803]12C在表中使用sequence.txt的相关文章

[20130901]12C在表中使用sequence(补充).txt

[20130901]12C在表中使用sequence(补充).txt 对以前写的内容做一些补充. SQL> @ver BANNER                                                                               CON_ID-------------------------------------------------------------------------------- ----------Oracle Da

[20151004]表中最大分区数.txt

[20151004]表中最大分区数.txt --oracle的表最大分区数能达到多少.依稀记得以前2^20-1 . SCOTT@test01p> select power(2,20)-1 N10 from dual ;                   N10 ---------------------               1048575 --参考链接: http://blog.itpub.net/267265/viewspace-1061109/ D:\tools\rlwrap>o

[20131130]12c建表period for valid.txt

[20131130]12c建表period for valid.txt 9i以后查询过去某个时间点,加入as of timestap 或者 as of scn,但是这个受undo*参数的控制. 当然11G加入Flashback DataArchive特性,就是通过一个表空间记录表的一些变化,查询历史数据. 实际上这个就是flashback table的扩展(个人认为)!. 12c 有一个新特性 Temporal Validity. 通过加入有效的日期字段,来实现flashback query的特

Excel2010工作表中如何导入txt文件

  1.打开Excel2010,点击"数据"选项卡,然后在最左边的"获取外部数据"菜单中选择"自文本"选项,在"导入文本文件"窗口中选择需要导入的文件. 2.打开"文本导入向导-步骤之1(共3步)"对话框中并选择"分隔符号"选项.点击"下一步". 3.打开"文本导入向导-步骤之2"对话框,并添加分列线,点击"下一步"按钮. 4.

Excel2010工作表中如何导入.txt文件

  通常在使用Excel工作表的时候,我们会把一些文件导入到Excel表格当中,但是许多文本文件字符不规则,不好排列,导入到Excel表格当中看起来十分混乱,这时候我们该如何是好呢? 操作步骤 1.打开Excel2010,点击"数据"选项卡,然后在最左边的"获取外部数据"菜单中选择"自文本"选项. 2.在"导入文本文件"窗口中选择需要导入的文件.按"导入"按钮. 3.打开"文本导入向导-步骤之1(

利用groovy把表中数据导出成txt或csv

胶水语言就是胶水,写起也挺快的.这个脚本主要是从数据库中把表中的数据导出来生成文件.而不用每次都打开数据库编辑器去手工收集.然后结合强大的脚本(shell,bat)等基本就可以实现定时生成最新数据文本了. 目前这个groovy脚本只要输入sql语句,便会自动去反射表中的字段和类型.脚本名称:export.groovy import groovy.sql.Sql; try { if(this.args.size()<1) {     println "格式错误!请参照下面的正确格式"

[20130708]传输表空间与data_object_id.txt

[20130708]传输表空间与data_object_id.txt 传输表空间与scn.txt:http://space.itpub.net/267265/viewspace-750140 初学者经常搞混视图dba_objects中object_id和data_object_id,一般建立表两者是相等的,容易混淆.建立分区表的话,表仅仅有object_id,没有data_object_id,分区表才有data_object_id. 实际上有些对象比如view,sequence等仅仅有objec

在MSSQL中实现Sequence功能

目的: 通过该功能取代 MSSQL 中的表ID列自动递增功能   主题一:如何通过Sequence名得到一个Sequence值 方法: 1.    创建一个表Sequence,保存Sequence的值 2.    创建一个存储过程GetNextSequence,以通过它得到下一个Sequence 主题二:如何通过一个表名得到一个Sequence值 1.    创建一个表TableSequence,保存表中的列对应的是哪个Sequence 2.    创建一个存储过程CreateTableSeq,

ORACLE中序列-sequence的应用

oracle oracle中没有象Acces中自动编号的字段类型,所以在oracle中要想用一个字段自动增值,还比较麻烦,在此提供给大家一个方法,利用序列,来完成字段的自动增加,下边介绍一下怎么创建序列,使用序列,和删除序列. 1.创建序列--------------create sequence  create sequence  Seq_AutoID   //所起序列名叫 Seq_AutoID ,需要记住此序列名,以后方可调用 minvalue   1   //最小值从1开始 可以根据自己的