У меня есть 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 для счетчика. Это должно работать нормально, если одновременно нет двух вставок, которые заканчиваются одним и тем же счетчиком. Шансы высоки, что на самом деле это никогда не происходит - но лучше экономить, чем сожалеть.
Я не знаю, можно ли использовать генератор, но не думайте, что для каждого отца должен быть генератор.
Мой текущий подход использует вышеупомянутый триггер и добавляет уникальный индекс к FATHER_ID
+ COUNTER
, так что проходит только одна из одновременных вставок. Мне придется обрабатывать клиентскую часть исключения (и повторить попытку неудачной вставки).
Есть ли лучший способ справиться с этим прямо в Firebird?
PS: Никаких удалений в любой из двух таблиц не будет, поэтому это не проблема.
Благодарим вас за ответ. Я бы предпочел иметь счетчик в качестве поля, поэтому, наверное, сейчас буду придерживаться моей текущей попытки. Однако ваш альтернативный подход определенно интересен и может быть полезен для подобных проблем в будущем :) –