Как настроить сервер SQL для генерации сгруппированных индексов? - PullRequest
0 голосов
/ 23 апреля 2011

Скажем, у меня есть таблица Projects в базе данных для отслеживания активных проектов, а также таблица Tasks, которая отслеживает Tasks для каждого Project. У каждой таблицы есть обычный автоматически сгенерированный первичный ключ, однако я также хочу, чтобы у каждой задачи был TaskNumber относительно Project. Таким образом, при добавлении Tasks к Project им присваиваются инкрементные номера от 001, 002, 003 и т. Д., Начиная с 001 для каждого проекта.

Сначала я подумал, что могу сохранить поле NextTaskNumber с каждым Project. Однако несколько человек могут запросить один и тот же номер из базы данных, прежде чем кто-либо сможет добавить свою новую задачу и увеличить поле NextTaskNumber. Я не хочу в конечном итоге дублировать номера задач с Project.


Обновление

Спасибо за ответы, но я забыл упомянуть один критический момент. Я на самом деле обращаюсь к базе данных через NHibernate, а не напрямую через команды SQL. Так есть ли способ сделать это через N Hibernate mapping? Или же я мог бы установить триггер в базе данных для заполнения поля номера задачи при создании новой задачи?

Ответы [ 2 ]

0 голосов
/ 23 апреля 2011

Следующий код является предметом моих обычных обязательств "Я только что проснулся":

Одиночная вставка

INSERT INTO Tasks
            (ProjectID,Name,GroupedIndexField)
SELECT @ProjectID
       , 'Do Some Work'
       , ( SELECT ISNULL(MAX(GroupedIndexField), 0)
             FROM Tasks
            WHERE ProjectID = @ProjectID ) + 1

Многократная вставка

INSERT INTO Tasks
            (ProjectID,Name,GroupedIndexField)
SELECT tblTasksToInsert.ProjectID
       , tblTasksToInsert.Name
       , ( SELECT ISNULL(MAX(GroupedIndexField), 0)
             FROM Tasks
            WHERE ProjectID = tblTasksToInsert.ProjectID ) + ROW_NUMBER() OVER (PARTITION BY tblTasksToInsert.ProjectID ORDER BY InsertionOrder)
  FROM tblTasksToInsert

Создать представление

Создать представление с помощью следующего запроса:

SELECT TaskID
       , ProjectID
       , ROW_NUMBER() OVER (PARTITION BY ProjectID ORDER BY TaskID ) AS GroupedIndexValue
  FROM Tasks

SQL Server Denali

SQL Server Denali позволяет создавать последовательности. Вы можете иметь несколько последовательностей на проект, хотя это не совсем правильный способ их использования.

0 голосов
/ 23 апреля 2011

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

...