Столбец уникального идентификатора 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 ответа:
Нет. Цель идентификации (или последовательности) состоит только в том, чтобы генерировать инкрементное целое число. Могут быть пробелы, так как значения не используются повторно, и значения могут быть зарезервированы, но не использованы.
Вы можете использовать выражение в запросах, чтобы показать желаемое значение.
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 designCREATE 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]) )