Значения столбца PostgreSQL должны быть в последовательности - PullRequest
2 голосов
/ 09 августа 2011

Как бы я определил столбец в PostgreSQL так, чтобы каждое значение было в последовательности, а не в последовательности, которую вы получаете при использовании типа serial, а в том, что значение 2 не может быть вставлено, если значение 1 уже не существует в колонна?

Ответы [ 3 ]

1 голос
/ 19 декабря 2012

Я написал подробный пример реализации последовательности без промежутков, используя PL / PgSQL здесь .

Общая идея заключается в том, что вы хотите, чтобы в таблице хранились значения последовательности, и вы используете SELECT ... FOR UPDATE, за которым следует UPDATE - или сокращение UPDATE ... RETURNING - для получения значений из него при блокировке строки до фиксации транзакции или откатывается.

0 голосов
/ 09 августа 2011

Теоретически, вы можете использовать ограничение, которое работает следующим образом. (Но на практике это не сработает.)

  1. Подсчет строк.
  2. Оценить max(column) - min(column) + 1.
  3. Сравните результаты.

Возможно, вам придется вставить одну строку перед созданием ограничения CHECK. Если вы этого не сделаете, max (столбец) вернет NULL. С одним рядом

  1. Количество строк (1).
  2. Оценить max(column) - min(column) + 1. (1 - 1 + 1 = 1)
  3. Сравните результаты. (1 = 1)

С 10 рядами. ,

  1. Подсчитать строки (10).
  2. Оценка max(column) - min(column) + 1. (10 - 1 + 1 = 10)
  3. Сравните результаты. (10 = 10)

Не имеет значения, начинается ли последовательность с 1; этот способ проверки всегда будет показывать пробел, если таковой существует. Если вам нужно было гарантировать, что последовательность без промежутков начинается с 1, вы можете добавить это к ограничению CHECK.

Насколько я знаю, нет никакого способа сделать это декларативно с любыми текущими базами данных. Для этого вам понадобится поддержка CREATE ASSERTION. (Но я могу ошибаться.) В PostgreSQL я думаю, что ваш единственный шанс - процедурный код в нескольких триггерах AFTER.

У меня есть только один стол, который должен быть без зазоров. Это стол календаря. Раз в ночь мы запускаем запрос, который выполняет эти вычисления, и он сообщает мне, есть ли у меня разрыв.

0 голосов
/ 09 августа 2011

Вы пишете on insert tigger или check constraint.Тем не менее, это все равно позволит удалить «1» после этого, а «2» останется в таблице, вам, вероятно, придется решить эту проблему тоже.

...