在Oracle 11g中使DB列的值自动递增1

时间:2013-12-18 11:29:43

标签: sql oracle oracle11g

我有Oracle DB 11g企业版,我想通过从以下文件中读取sql脚本来创建表:

CREATE SEQUENCE VerHist_SeqNum
   START WITH 1 
   INCREMENT BY 1;


CREATE TABLE VerHist
(
  SequenceNumber NUMBER(10,0)  NOT NULL,
  SQLFileName VARCHAR2(100)  NOT NULL,
  STATUS VARCHAR2(10)  NOT NULL,
  AppliedDate DATE  NOT NULL,
  DateCreated DATE 
   DEFAULT (SYSDATE),
  DateUpdated DATE 
   DEFAULT (SYSDATE),
  CONSTRAINT PK_VerHist PRIMARY KEY( SequenceNumber ),
  CONSTRAINT UC_VerHist_SQLFileNa UNIQUE( SQLFileName )
);


CREATE OR REPLACE TRIGGER VerHist_SeqNum_TRG
   BEFORE INSERT 
   ON VerHist
   FOR EACH ROW
   BEGIN
:NEW.SequenceNumber := VerHist_SeqNum.NEXTVAL;
   END;

通过java代码我正在阅读sql脚本,然后执行以下3个查询:

  1. 创建序列
  2. 创建表
  3. 创建触发器,在运行INSERT查询时自动递增“SequenceNumber”
  4. 我已经通过从我的MS SQL Server脚本转换创建了这个sql脚本,在这种情况下我只需运行一个查询而不是3个。

    我的问题是,是否可以不将SequenceTrigger仅用于自动增量目的,我可以简单地修改我的Create table查询来执行此操作,方式它是使用CONSTRAINT在MS SQL中完成的。

    我想这样做,因为如果我删除表并创建新表,那么我希望序列从1重新启动,而在当前情况下它不会。

2 个答案:

答案 0 :(得分:3)

对于Oracle 11g,您必须使用您使用过的方法。没有可用的自动增量功能,可帮助您取消序列和触发器。

正如您所说,您可能希望删除该表,并希望序列从1开始,为此,您需要重新创建序列,以便它以所需的值开始。

启动Oracle 12c, IDENTITY 列可用,可帮助您实现自动增量功能。有关详细信息,请参阅this

答案 1 :(得分:1)

不,这是不可能的。

可以在此处找到在Oracle中创建表的语法图:http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_7002.htm

从Oracle看这个规范,很容易看出CREATE TABLE语句不允许创建序列或触发器作为创建表的一部分(事实上,每个任务 - 创建一个表,创建序列和创建触发器 - 在Oracle中被视为单独的DDL命令); Oracle也不允许为列定义这样的约束。