我正在用 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 一样使用身份 key 生成策略。有人可以和我分享一些意见吗?
编辑(解决方案) :根据兰迪的回答,在触发器中添加一个条件就足够了,如下所示:
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;
/
工作正常。谢谢兰迪:)
请您参考如下方法:
有时您可能会使用检查 :new.id 是否为空的策略。
如果为空,则使用序列,如果不为空,则使用提供的值。
唯一性约束将防止实际错误。




