偶数id值。复杂的序列映射(grails oracle)

偶数id值。复杂的序列映射(grails oracle),oracle,grails,gorm,Oracle,Grails,Gorm,我正在grails中编写一个webapp,这是我第一次在底层使用oracle。每个表都有从序列生成的id,我在插入前使用触发器设置id,如下所示: CREATE TABLE "RECIPE" ( "ID" NUMBER(19,0) NOT NULL ENABLE, ... PRIMARY KEY ("ID") ENABLE ) / CREATE SEQUENCE "RECIPE_SEQ" MINVALUE 1 MAXVALUE 99999999

我正在grails中编写一个webapp,这是我第一次在底层使用oracle。每个表都有从序列生成的id,我在插入前使用触发器设置id,如下所示:

CREATE TABLE  "RECIPE" 
   (    "ID" NUMBER(19,0) NOT NULL ENABLE, 
    ...
     PRIMARY KEY ("ID") ENABLE
   )
/

 CREATE SEQUENCE   "RECIPE_SEQ"  MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE
/

CREATE OR REPLACE TRIGGER  "BI_RECIPE" 
  before insert on "RECIPE"               
  for each row  
begin   
    select "RECIPE_SEQ".nextval into :NEW.ID from dual; 
end; 
/
我还制作了地图

static mapping = {
        table 'RECIPE'
        version false        
        id column:'ID', generator:'sequence', params:[sequence:'RECIPE_SEQ']
        ...
}
现在,在插入域对象时,它总是有一个偶数id值。我发现产生偶数id是因为grails从序列中获取id值,然后在实际插入db触发器时,再次从序列中获取id值并覆盖grails给定的id值

这怎么办?对我来说,最好的解决方案是oracle像mysql一样使用身份密钥生成策略。有人能和我分享一些意见吗

编辑解决方案:根据Randy的回答,在触发器中添加一个条件就足够了,如下所示:

CREATE OR REPLACE TRIGGER  "BI_RECIPE" 
  before insert on "RECIPE"               
  for each row  
begin
    if :NEW.ID IS NULL then
        select "RECIPE_SEQ".nextval into :NEW.ID from dual; 
    end if;
end; 
/

很好。Thx Randy:

有时您可能会使用检查:new.id是否为空的策略

如果为空,则使用序列;如果不为空,则使用提供的值


唯一性约束将防止实际错误。

有时您可以使用检查:new.id是否为null的策略

如果为空,则使用序列;如果不为空,则使用提供的值


唯一性约束将防止实际错误。

首先是确定序列值中的“间隙”是否可以容忍。只要它们保持独特性,它们就应该是好的。第二个问题是确定在每次插入时获取额外id的开销是否是一个问题——我怀疑这会是一个问题。第一个问题是确定序列值中的“间隙”是否可以容忍。只要它们保持独特性,它们就应该是好的。第二个问题是确定在每次插入时获取额外id的开销是否是一个问题——我怀疑这会是一个问题。