偶数id值。复杂的序列映射(grails oracle)
我正在grails中编写一个webapp,这是我第一次在底层使用oracle。每个表都有从序列生成的id,我在插入前使用触发器设置id,如下所示:偶数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
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的开销是否是一个问题——我怀疑这会是一个问题。