Поля AutoIncrement на базах данных без автоинкрементного поля

Убедитесь, что класс highlight-row имеет свойство: font-weight:bold.

И заменить содержимое функции на:

$('#costCentersList li label').removeClass('highlight-row');
$(this).find('label').addClass('highlight-row');

9
задан Click Ok 8 February 2009 в 21:36
поделиться

4 ответа

Механизм для генерации значений уникального идентификатора не должен подвергаться изоляции транзакции. Это требуется, чтобы база данных сгенерировала отличное значение для каждого клиента, лучше, чем прием SELECT MAX(id)+1 FROM table, который приводит к состоянию состязания, если два клиента пытаются выделить новый id значения одновременно.

Вы не можете моделировать эту операцию с помощью стандартных SQL-запросов (если Вы не используете блокировки таблицы или сериализуемые транзакции). Это должен быть механизм, встроенный в механизм базы данных.

ANSI SQL не описал операцию для генерации уникальных значений для суррогатных ключей до SQL:2003. Перед этим не было никакого стандарта для автопостепенного увеличения столбцов, таким образом, почти каждый бренд RDBMS предоставил некоторое собственное решение. Естественно они варьируются много, и нет никакого способа использовать их простым, независимым от базы данных способом.

  • MySQL имеет AUTO_INCREMENT опция столбца, или SERIAL псевдотип данных, который эквивалентен BIGINT UNSIGNED AUTO_INCREMENT;
  • Microsoft SQL Server имеет IDENTITY опция столбца и NEWSEQUENTIALID() который является чем-то между автоинкрементом и GUID;
  • Oracle имеет a SEQUENCE объект;
  • PostgreSQL имеет a SEQUENCE объект, или SERIAL псевдотип данных, который неявно создает объект последовательности согласно соглашению о присвоении имен;
  • InterBase/Firebird имеет a GENERATOR объект, который в значительной степени похож на a SEQUENCE в Oracle; поддержки Firebird 2.1 SEQUENCE также;
  • SQLite рассматривает любое целое число, объявленное как Ваш первичный ключ как неявное автопостепенное увеличение;
  • DB2 UDB имеет примерно все: SEQUENCE объекты, или можно объявить столбцы с"GEN_ID"опция.

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

16
ответ дан 4 December 2019 в 10:34
поделиться

Я думаю, что Вашим вопросом является на самом деле вполне хороший. Однако легко потеряться, пытаясь придумать SQL только решение. В действительности Вы захотите безопасность оптимизации и транзакции, предоставленную при помощи реализаций базы данных автоинкрементных типов.

Если необходимо абстрагировать реализацию автоинкрементного оператора, почему бы не создать хранимую процедуру для возвращения автоинкрементного значения. Большинство хранимых процедур доступа диалектов SQL относительно тем же способом и это должно быть более портативно. Затем можно создать базу данных определенная автоинкрементная логика при создании sproc - избавление от необходимости изменить много операторов, чтобы быть конкретным поставщиком.

Сделанный этот путь, Ваши вставки могли быть столь же простыми как:

INSERT INTO foo (id, name, rank, serial_number)
 VALUES (getNextFooId(), 'bar', 'fooRank', 123456);

Затем определите getNextFooId () в особенном методе базы данных, когда база данных будет инициализирована.

2
ответ дан 4 December 2019 в 10:34
поделиться

Большинство баз данных, которые не имеют автоинкрементных полей как SQL Server (я думаю Oracle конкретно) имеет последовательности, где Вы просите у Последовательности следующее число. Неважно, сколько людей запрашивает числа одновременно, все получают уникальное число.

1
ответ дан 4 December 2019 в 10:34
поделиться

Традиционное решение состоит в том, чтобы иметь таблицу идентификаторов, которые выглядят примерно так

CREATE TABLE ids (
  tablename VARCHAR(32) NOT NULL PRIMARY KEY,
  nextid INTEGER
)

который s заполнил с одной строкой на таблицу при создании базы данных.

Вы затем делаете выбор для получения следующего следующего идентификатора для таблицы, в которую Вы вставляете, увеличиваете его и затем обновляете таблицу новым идентификатором. Очевидно, там блокируют проблемы здесь, но для баз данных с умеренными уровнями вставки это работает хорошо. И это абсолютно портативно.

1
ответ дан 4 December 2019 в 10:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: