2014-12-19 26 views
0

我想知道在创建表格并且已经插入了相当多的数据之后,如果您想要创建一个序列,结果是什么。创建表格后很长时间创建触发器

this is because PEAR's DataObject's insert() method sometimes skips incremental IDs

因此,这里是实现这一目标的例子,但这是时间量过去之后做的,如果正确的方法是什么?

表定义:

CREATE TABLE departments (
    ID   NUMBER(10) NOT NULL, 
    DESCRIPTION VARCHAR2(50) NOT NULL); 

ALTER TABLE departments ADD (
    CONSTRAINT dept_pk PRIMARY KEY (ID)); 

CREATE SEQUENCE dept_seq; 

触发定义:

CREATE OR REPLACE TRIGGER dept_bir 
BEFORE INSERT ON departments 
FOR EACH ROW 

BEGIN 
    SELECT dept_seq.NEXTVAL 
    INTO :new.id 
    FROM dual; 
END; 

回答

3

如果你的意思是你已经有插入,而不使用触发器ID现场数据,您将有唯一要检查是你的序列的“开始”=至少是现有的最大ID + 1

CREATE SEQUENCE dept_seq 
START WITH  2503 
INCREMENT BY 1 

那么它应该是非常好的。

1

这是因为PEAR的数据对象的insert()方法有时跳过增量的ID

为补充拉斐尔奥尔索斯的答案,使用序列不会无论如何保证你没有ID中的“孔”。考虑并发访问,或回滚

引述the documentation

当产生一个序列号,该序列被递增,独立提交或回滚事务的。如果两个用户同时递增相同的序列,则每个用户获取的序列号可能有间隙,因为序列号是由另一个用户生成的。

有一个有趣的回答同一个问题上Asktom

序列将永远不会生成数字的无间隙序列。

[...]

你不应该在一个序列生成什么,甚至接近数字的无间隙 顺序计数。它们是一种高速,高度可扩展的多用户方式,可为 生成表格的替代键。

连续的数字序列几乎是不可能的 与序列(只需要一个回滚 - 这些将发生)。

+0

如果我可以在你们之间划分正确的答案,我会。无论如何,谢谢你的贡献和赞赏。 – morne 2014-12-19 11:21:52