Столбец уникального идентификатора T-SQL как часть составного первичного ключа


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

CREATE TABLE [log] (
  [type] int NOT NULL,
  [stat] nvarchar(20) NOT NULL,
  [id] int IDENTITY (1, 1) NOT NULL,
  descr nvarchar(20),
  PRIMARY KEY ([type], [stat], [id])
)

Можно ли заставить [id] увеличиваться только тогда, когда два других поля PK имеют одинаковые значения, а не независимо, как сейчас? Например:

type    stat      id     descr
5       ERROR     1      Test  <---
3       WARNING   1      Test
5       ERROR     2      Test  <---
2       ERROR     1      Test
1       WARNING   1      Test
5       WARNING   1      Test
5       ERROR     3      Test  <---
3 2

3 ответа:

Нет. Цель идентификации (или последовательности) состоит только в том, чтобы генерировать инкрементное целое число. Могут быть пробелы, так как значения не используются повторно, и значения могут быть зарезервированы, но не использованы.

Вы можете использовать выражение в запросах, чтобы показать желаемое значение.

ROW_NUMBER() OVER (PARTITION BY type, stat ORDER BY id) AS Seq

Это, я думаю, сделает вашу работу

CREATE TABLE [LOG1] (
  [TYPE] INT NOT NULL,
  [STAT] NVARCHAR(20) NOT NULL,
  [ID] INT ,
  DESCR NVARCHAR(20),
  PRIMARY KEY ([TYPE], [STAT], [ID])
)

CREATE TRIGGER TR_LOG
ON [DBO].[LOG1]
INSTEAD OF INSERT
AS
 BEGIN
DECLARE @CNT INT=0
IF EXISTS(SELECT 'X' FROM LOG1 A JOIN INSERTED B ON A.TYPE=B.TYPE AND A.STAT=B.STAT)
SET @CNT=(SELECT COUNT(*) FROM LOG1 A JOIN INSERTED B ON A.TYPE=B.TYPE AND A.STAT=B.STAT)
PRINT @CNT
INSERT INTO LOG1(TYPE,STAT,ID,DESCR) 
SELECT TYPE,STAT,ID+@CNT,DESCR FROM INSERTED
END

Это не 3NF
Я бы исправил это с помощью data design

CREATE TABLE [logBase] (
  [id] int IDENTITY (1, 1) NOT NULL,
  PRIMARY KEY ([id])
)

CREATE TABLE [status] (
  [id] int IDENTITY (1, 1) NOT NULL,
  descr nvarchar(20),
  PRIMARY KEY ([id])
)

CREATE TABLE [log] (
  [type] int NOT NULL,
  [statusID] nvarchar(20) NOT NULL,
  [baseID] int NOT null, 
  descr nvarchar(20),
  PRIMARY KEY ([type], [statusID], [baseID])
)