【问题标题】:Using sequential values for the primary key in an INSERT query在 INSERT 查询中使用主键的顺序值
【发布时间】:2012-07-05 21:05:49
【问题描述】:

如何为具有顺序主键的 Oracle 数据库编写插入查询,以便插入语句自动获取序列中的下一个数字?

INSERT INTO LD_USER_ROLE(USER_ROLE_ID,INS_USER,INS_DATE, USERNAME) 
VALUES (100, 'sp22',to_date('2003/05/03 21:02:44','yyyy/mm/dd hh24:mi:ss'),'JOHN BARRY', )

在上面的语句中,我已经硬编码了键 'USER_ROLE_ID' 的值 100,但我想按照第一段中的说明进行更改。

【问题讨论】:

    标签: oracle


    【解决方案1】:

    你为什么不像这样为你的序列创建一个触发器:

    顺序:

    CREATE SEQUENCE LD_USER_ROLE_SEQ
        INCREMENT BY 1 START WITH 1 NOMAXVALUE NOMINVALUE NOCYCLE NOCACHE NOORDER
    

    触发器:

    CREATE TRIGGER LD_USER_ROLE_INSERT BEFORE INSERT ON LD_USER_ROLE
        REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
    BEGIN
        SELECT LD_USER_ROLE_SEQ.NEXTVAL INTO :NEW.USER_ROLE_ID FROM DUAL;
    END;
    

    触发器将在每次插入时自动获取下一个值/id(如 mysql 中的 auto_increment)。

    【讨论】:

    • 在 CREATE SEQUENCE 的末尾需要一个分号,兄弟。
    【解决方案2】:

    除了使用触发器外,还可以在插入语句中直接使用序列:

    CREATE SEQUENCE LD_USER_ROLE_SEQ;
    
    INSERT INTO LD_USER_ROLE
       (USER_ROLE_ID,INS_USER,INS_DATE, USERNAME) 
    VALUES 
       (ld_user_role_seq.nextval, 'sp22',to_date('2003/05/03 21:02:44','yyyy/mm/dd hh24:mi:ss'),'JOHN BARRY', )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 2017-11-19
      • 1970-01-01
      • 1970-01-01
      • 2014-03-26
      相关资源
      最近更新 更多