创建表后很长时间创建触发器

时间:2014-12-19 07:29:22

标签: php oracle pear

如果你想在创建一个表并且已经插入了相当多的数据之后想要创建一个序列,我想知道这个序列是什么。

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;

2 个答案:

答案 0 :(得分:3)

如果您的意思是您已经在不使用触发器的情况下插入了ID字段的数据,那么您唯一需要检查的是序列的“开始”=至少是最大现有ID + 1

CREATE SEQUENCE dept_seq
 START WITH     2503
 INCREMENT BY   1

然后应该完全没问题。

答案 1 :(得分:1)

  

这是因为PEAR的DataObject的insert()方法有时跳过增量ID

作为RaphaëlAlthaus答案的补充,使用序列无论如何都不能保证ID中没有“漏洞”。考虑并发访问或回滚

引用the documentation

  

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

Asktom上对同一个问题有一个有趣的答案:

  

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

     

[...]

     

你永远不应该指望生成任何甚至接近无间隙的序列   数字序列。它们是一种高速,极易扩展的多用户方式   为表格生成代理键。

     

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