【发布时间】:2011-12-19 13:42:05
【问题描述】:
我正在用 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 给定的值。
那该怎么办呢?对我来说最好的解决方案是 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;
/
工作正常。谢谢兰迪:)
【问题讨论】:
-
首先是判断序列值中的'gap'是否可以容忍。只要它们保持独特,它们就应该没问题。第二个是确定在每次插入时获取额外 id 的开销是否是一个问题 - 我怀疑它会是。
标签: oracle grails grails-orm