繁体   English   中英

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

[英]Make value of a DB column auto increment by 1 in Oracle 11g

我有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”

我已经通过从我的MS SQL Server脚本转换创建了这个sql脚本,在这种情况下我只需运行一个查询而不是3。

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

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

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

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

启动Oracle 12c,可以使用IDENTITY列,它可以帮助您实现自动增量功能。 有关更多详细信息,请参阅此处

不,这是不可能的。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM