[英]T-SQL Unique Identity Column as Part of Composite Primary Key
假设您有一个具有以下结构的表:
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])
)
只有当其他两个PK字段具有相同的值时,是否可以强制[id]
递增,而不是现在独立? 例如:
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 <---
不.IDENTITY(或SEQUENCE)的目的只是生成增量整数。 可能存在间隙,因为值不会被重用,并且值可能会被保留但不会被使用。
您可以在查询中使用表达式来显示所需的值。
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
我会用数据设计修复它
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])
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.