【问题标题】:Make value of a DB column auto increment by 1 in Oracle 11g在 Oracle 11g 中使数据库列的值自动递增 1
【发布时间】:2014-01-06 13:27:02
【问题描述】:

我有 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 查询来做到这一点,它在 MS SQL 中完成的方式使用约束。

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

【问题讨论】:

  • 我不这么认为...据我所知,当您删除表时,触发器也会自动删除。
  • SELECT VerHist_SeqNum.NEXTVAL INTO :NEW.SequenceNumber FROM DUAL; 在 11g 中使用 :NEW.SequenceNumber := VerHist_SeqNum.NEXTVAL 可以更简单地编写。如果您希望从序列中获取列的默认值,则需要在可能的情况下升级到 12c。
  • 事实上我只在我的查询中使用它,我的问题也发生了变化。谢谢。

标签: sql oracle oracle11g


【解决方案1】:

不,不可能。

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

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

【讨论】:

    【解决方案2】:

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

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

    从 Oracle 12c 开始,IDENTITY 列可用,可帮助您实现自动增量功能。更多详情请参考this

    【讨论】:

      猜你喜欢
      • 2017-07-01
      • 2017-05-21
      • 2016-08-09
      • 2014-07-09
      • 2018-10-14
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 2016-01-07
      相关资源
      最近更新 更多