在Oracle中为主键插入随机值

时间:2015-07-05 10:14:39

标签: sql oracle oracle11g oracle10g

我有一个小表,用于插入配置数据。

CREATE SEQUENCE AGENT_GROUP_SEQ
 INCREMENT BY 1
 MAXVALUE 9999999999999999999999999999
 NOMINVALUE
 CACHE 20
/

CREATE TABLE AGENT_GROUP(
  ID NUMBER(38,0) NOT NULL,
  NAME VARCHAR2(40 ) NOT NULL,
  STATUS VARCHAR2(30 ),
  TYPE VARCHAR2(30 ),
  DATE_ADDED DATE,
  LAST_MODIFIED DATE,
  DESCRIPTION CLOB
)
/

CREATE TRIGGER AGENT_GROUP_TRG
  BEFORE INSERT
  ON AGENT_GROUP
 REFERENCING  OLD AS OLD NEW AS NEW
 FOR EACH ROW
  BEGIN
  <<COLUMN_SEQUENCES>>
  BEGIN
    IF INSERTING AND :NEW.ID IS NULL THEN
      SELECT AGENT_GROUP_SEQ.NEXTVAL INTO :NEW.ID FROM SYS.DUAL;
    END IF;
  END COLUMN_SEQUENCES;
END;
/

我有一个ID列,用于唯一编号。我设法创建序列,它将在每个插入上自动生成ID值。但问题是我有太多的插入和删除操作一段时间后我将达到序列最大值。

有没有其他方法可以在每次插入时生成随机ID?

2 个答案:

答案 0 :(得分:1)

使用某种UUID生成服务器端或使用db功能。

http://lakenine.com/guid-values-as-primary-keys/

答案 1 :(得分:0)

您的触发器以及您的问题非常详细&#34;详细&#34;。 不是您问题的真实答案,但此代码与您的代码完全相同。

CREATE TRIGGER AGENT_GROUP_TRG
  BEFORE INSERT ON AGENT_GROUP
  FOR EACH ROW
BEGIN
    :NEW.ID := NVL(:NEW.ID, AGENT_GROUP_SEQ.NEXTVAL);
END;
/

简化你的生活!

关于你的序列。如果您担心,可以将其设为CYCLE。 不用担心,即使您的表只包含一个包含此主键的列,数据量也将超过全球所有可用存储容量。

CREATE SEQUENCE AGENT_GROUP_SEQ START WITH 1 NOMAXVALUE MINVALUE 1 CYCLE CACHE 20;