Идентификационный идентификатор с автоматическим приращением для групп записей - PullRequest
3 голосов
/ 17 февраля 2011

У меня есть дочерняя таблица, связанная с родителем по первичному ключу родителя.В настоящее время дочерняя таблица имеет стандартный идентификатор int IDENTITY(1,1).Это хорошо для моих целей, и это не изменится, но для пользователя они будут видеть списки несвязанных идентификаторов, когда будут просматривать дочерние строки, связанные с родителем.

Я хотел бы иметьидентификатор дисплея, который начинается с 1 и увеличивается (как столбец идентификаторов) для каждой группы записей.

Моя дочерняя таблица будет выглядеть примерно так:

ChildID-PK ParentID-FK DisplayID
 1          1           1
 2          1           2
 3          2           1
 4          3           1
 5          1           3

Возможные решения;

  • При вставке записи, SELECT MAX(DisplayID) + 1 FROM tbl WHERE ParentID = @ParentID использовать в качестве новой записи DisplayID.Это может быть проблематично, если много людей редактируют группу записей одновременно.
  • Используйте ROW_NUMBER(), чтобы получить DisplayID, но в этом случае, если запись должна была быть удалена, DisplayID для существующих записейможет изменитьсяЭтого не может быть, потому что пользователи могут ссылаться на определенные идентификаторы DisplayID при вводе данных.

1 Ответ

0 голосов
/ 17 февраля 2011

Самый безопасный способ, который я могу придумать, - создать нечто похожее на объект последовательности Oracle.В этом блоге консультативной группы по работе с клиентами по разработке Microsoft SQL Server есть хороший пример: *1002* (я предпочитаю вариант 2).

Вы должны создать последовательность для каждой вставленной родительской строки:

EXEC usp_CreateNewSeq N'ParentSeq' + @parentId

и получите следующую последовательность для каждой строки в таблице сопоставления:

INSERT INTO [table] VALUES (@childId, @parentId, EXEC 'GetNewSeqVal_'+ @parentId)

Я не уверен в своем синтаксисе и не могу проверить его на знание, поэтомуне стесняйтесь меня поправлять.


Более простой метод: добавить столбец в родительскую таблицу с именем MaxChildId со значением по умолчанию = 0. Каждый раз, когда вы добавляете дочернюю строку, вы должны обновлятьэтот столбец и используйте его новое значение как DisplayID.

declare @vid int

UPDATE [ParentTable]
SET @vid = MaxChildId+1, MaxChildId = MaxChildId+1
WHERE Id = ParentID
select @vid

. Этот метод может вызвать совпадения при обновлении родительской таблицы.


После всего сказанного, я думаю, вам лучшерассмотреть редизайн для решения этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...