[H2 and Firebird] auto_increment, идентификатор или триггер плюс генератор? - PullRequest
1 голос
/ 03 мая 2010

в Firebird единственный способ получить колонку с автоинкрементом - это установить генератор и использовать его с триггером.

В H2 db есть auto_increment и ключевые слова для идентификации.

Какой самый лучший способ?

Mysql также использует auto_increment, но есть некоторые проблемы с чтением cuncurrence и блокировкой таблицы, не правда ли?

Спасибо.

1 Ответ

2 голосов
/ 03 мая 2010

Нет, нет проблем одновременного чтения и блокировки таблицы.

Преимущество использования функции псевдокнопки, встроенной в каждую СУБД, состоит в том, что механизм СУБД обрабатывает распределение значений идентификатора атомарно, поэтому одновременные клиенты не будут выделять одно и то же значение идентификатора. Требуется только краткая блокировка внутреннего счетчика идентификаторов, а не вся таблица.

То, что лучше, не имеет значения. Вы должны использовать функцию, предоставляемую СУБД, которую вы используете. К сожалению, псевдокейки не были определены в стандарте ANSI SQL до SQL: 2003. К тому времени каждый поставщик создал собственную проприетарную функцию и синтаксис.

  • Oracle использует SEQUENCE объекты, которые похожи на Firebird GENERATOR или SEQUENCE объекты.
  • Microsoft SQL Server использует IDENTITY в качестве параметра столбца.
  • IBM DB2 и PostgreSQL поддерживают последовательности, но у них также есть некоторая декларативная магия, позволяющая столбцам неявно принимать значения из последовательностей.
  • MySQL использует параметр столбца AUTO_INCREMENT, а также поддерживает псевдо-тип данных SERIAL, чтобы обеспечить некоторую перекрестную совместимость с PostgreSQL.
  • SQLite предполагает, что любой целочисленный столбец первичного ключа является автоинкрементным.

Если H2 поддерживает как IDENTITY, так и AUTO_INCREMENT, вероятно, он станет более привычным для людей, переходящих с MySQL или Microsoft SQL Server. Я не знаю H2, но я предполагаю, что обе синтаксические формы имеют доступ к одной и той же внутренней функции.

Я нашел документы для H2. Похоже, что IDENTITY и AUTO_INCREMENT используют SEQUENCE.

...