Автоматически увеличивать столбец на основе составного первичного ключа - PullRequest
0 голосов
/ 28 июня 2018

Предположим, у меня есть столбцы A, B и C. Где A, B и C составляют первичный ключ (составной). Я хочу, чтобы при вставке A / B столбец C увеличивался на единицу только для этой конкретной комбинации.

Esentially C будет отслеживать версию для комбинаций A / B. Вместе все записи должны быть уникальными.

Вот как я хочу, чтобы моя таблица выглядела после вставок:

  • [A] _ [B] _ [C] _
  • Foo Bar 1
  • Foo Bar 2
  • Бар Баз 1
  • Foo Bar 3
  • Бар Баз 2
  • Фу Фу 1

Я бы хотел получить семя 1, основанное на группе A / B.

Есть идеи, как мне этого добиться? Я думаю, что мне понадобится своего рода триггер, а затем вычисление для максимума для текущего C для столбцов A / B?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Это не стоит того, в большинстве случаев. Гарантировать последовательный номер довольно сложно - и тем более, если вы принимаете во внимание обновления и удаления.

Альтернативный подход заключается в том, чтобы в качестве первичного ключа таблицы использовался столбец идентификаторов. Затем, если вы хотите порядковый номер, вы можете использовать:

select a, b, row_number() over (partition by a, b, order by table_id) as c

Если вы действительно хотите создать такое число, вам потребуется триггер insert, который выполняет вычисления - и блокирует всю таблицу в случае, если другая операция вставляет те же значения a / b. Вам также нужны триггеры для update с и delete с.

0 голосов
/ 28 июня 2018

Вам нужен триггер для этого. Что-то вроде:

CREATE TRIGGER [dbo].[tAI_AB]
   ON  [dbo].[AB]
   AFTER INSERT
AS
   DECLARE @A INT;
   DECLARE @B INT;
   DECLARE @C INT;
BEGIN
SET NOCOUNT ON;
   Set @A = (Select A from inserted);
   Set @B = (Select B from inserted);
   Set @C= (Select isnull(Max(C), 0) From AB where A=@A and B=@B);

   UPDATE AB Set C = @C+1 WHERE A=@A and B=@B and C is null;
END

Просто измените на соответствующие типы A и B и имена столбцов / таблиц.

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