【发布时间】: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 个查询:
- 创建序列
- 创建表
- 创建触发器,在运行 INSERT 查询时自动递增“SequenceNumber”
我通过从我的 MS SQL Server 脚本转换创建了这个 sql 脚本,在这种情况下我只需要运行一个查询而不是 3 个。
我的问题是,是否有可能没有 Sequence 和 Trigger 只是为了自动增量目的,我可以简单地修改我的 Create table 查询来做到这一点,它在 MS SQL 中完成的方式使用约束。
我想这样做是因为如果我删除表并创建新表,那么我希望序列从 1 重新开始,而在当前情况下不会。
【问题讨论】:
-
我不这么认为...据我所知,当您删除表时,触发器也会自动删除。
-
SELECT VerHist_SeqNum.NEXTVAL INTO :NEW.SequenceNumber FROM DUAL;在 11g 中使用:NEW.SequenceNumber := VerHist_SeqNum.NEXTVAL可以更简单地编写。如果您希望从序列中获取列的默认值,则需要在可能的情况下升级到 12c。 -
事实上我只在我的查询中使用它,我的问题也发生了变化。谢谢。