我有很多带有这样附加触发器的表
BEFORE INSERT
ON BRULES
...snip...
if inserting and :new.ID is NULL then
SELECT BRULES_SEQ.nextval into :new.ID FROM DUAL;
end if;
由于一种有趣的编码风格,应用程序确实在一些具有空 ID 的表上插入,这会触发触发器并使用现有序列。对于其他表,它获取最新记录的 ID 并添加 1。在这种情况下,不使用序列并且与表中的记录数不同步。
如何判断序列的下一个值是否对插入有效?我可以读取序列名称的所有触发器,然后执行一些动态 SQL 来比较序列的最大 ID 和当前值,但这似乎有点笨拙。
PK的价值来自不同的来源:可怕。使用序列将是首选方式。您无法通过查看字典来判断序列的下一个值到底是什么。缓存有效,显然是出于性能原因。如果您在字典中查找,您会发现缓存用完数字后有效的值。您不知道的是缓存使用了多远。
您可以忽略预先输入的 PK 值,如此有效地仅使用序列吗?它现在的工作方式几乎和从表中查询 max(pk)+1 一样糟糕。
如果出于某种原因您不想使用 ik_zelf 的解决方案(首选),您可以更改序列以使用负值。这将使它不受 Add 1 代码的影响,直到您可以更改它。