gpt4 book ai didi

oracle - 甚至 id 值。棘手的序列映射(grails oracle)

转载 作者:行者123 更新时间:2023-12-02 14:21:02 25 4
gpt4 key购买 nike

我正在用 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 是否为空的策略。

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

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

关于oracle - 甚至 id 值。棘手的序列映射(grails oracle),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8562196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com