Теоретически, вы можете использовать ограничение, которое работает следующим образом. (Но на практике это не сработает.)
- Подсчет строк.
- Оценить
max(column) - min(column) + 1
.
- Сравните результаты.
Возможно, вам придется вставить одну строку перед созданием ограничения CHECK. Если вы этого не сделаете, max (столбец) вернет NULL. С одним рядом
- Количество строк (1).
- Оценить
max(column) - min(column) + 1
. (1 - 1 + 1 = 1)
- Сравните результаты. (1 = 1)
С 10 рядами. ,
- Подсчитать строки (10).
- Оценка
max(column) - min(column) + 1
. (10 - 1 + 1 = 10)
- Сравните результаты. (10 = 10)
Не имеет значения, начинается ли последовательность с 1; этот способ проверки всегда будет показывать пробел, если таковой существует. Если вам нужно было гарантировать, что последовательность без промежутков начинается с 1, вы можете добавить это к ограничению CHECK.
Насколько я знаю, нет никакого способа сделать это декларативно с любыми текущими базами данных. Для этого вам понадобится поддержка CREATE ASSERTION
. (Но я могу ошибаться.) В PostgreSQL я думаю, что ваш единственный шанс - процедурный код в нескольких триггерах AFTER.
У меня есть только один стол, который должен быть без зазоров. Это стол календаря. Раз в ночь мы запускаем запрос, который выполняет эти вычисления, и он сообщает мне, есть ли у меня разрыв.