我有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个查询:
我已经通过从我的MS SQL Server脚本转换创建了这个sql脚本,在这种情况下我只需运行一个查询而不是3个。
我的问题是,是否可以不将Sequence
和Trigger
仅用于自动增量目的,我可以简单地修改我的Create table
查询来执行此操作,方式它是使用CONSTRAINT在MS SQL中完成的。
我想这样做,因为如果我删除表并创建新表,那么我希望序列从1重新启动,而在当前情况下它不会。
答案 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也不允许为列定义这样的约束。