我有 2 张桌子,我们称它们为T_FATHER
和T_CHILD
,每个父亲可以有多个孩子,如下所示:
T_FATHER
--------------------------
ID - BIGINT, from Generator
T_CHILD
-------------------------------
ID - BIGINT, from Generator
FATHER_ID - BIGINT, Foreign Key
现在我想在T_CHILD
表中添加一个计数器,它以 1 开头并为每个新孩子添加 1,但不是全局的,而是每个父亲,例如:
ID | FATHER_ID | COUNTER |
--------------------------
1 | 1 | 1 |
--------------------------
2 | 1 | 2 |
--------------------------
3 | 2 | 1 |
--------------------------
我最初的想法是创建一个插入前触发器,用于计算给定父亲有多少孩子,并为计数器加 1。这应该可以正常工作,除非同时有 2 个插入,这将以相同的计数器结束。这种情况实际上从未发生过的可能性很高——但保存总比后悔好。
我不知道是否可以使用发电机,但不要这么认为,因为每个父亲都必须有一台发电机。
我目前的方法是使用上述触发器并向FATHER_ID
+添加唯一索引COUNTER
,以便只有一个同时插入通过。我将不得不在客户端处理异常(并重新尝试失败的插入)。
有没有更好的方法直接在 Firebird 中处理这个问题?
PS:这两个表中的任何一个都不会有任何删除,所以这不是问题。