T-SQL唯一标识列作为复合主键的一部分
假设您有一个具有以下结构的表:T-SQL唯一标识列作为复合主键的一部分,sql,sql-server,tsql,primary-key,composite-primary-key,Sql,Sql Server,Tsql,Primary Key,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
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 <---
类型stat id descr
5错误1测试否。标识(或序列)的目的只是生成增量整数。由于值未被重用,可能存在间隙,并且值可能被保留但未被使用
可以在查询中使用表达式来显示所需的值
ROW_NUMBER() OVER (PARTITION BY type, stat ORDER BY id) AS Seq
这不是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])
)
我想这能帮你完成任务
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
用一个词回答:递增的NoUse触发器可以通过计算列实现吗?@Hannobo,我不这么认为。关键是生成新的ID。我不明白我们怎么能只对计算列这样做。即使如此,它也可能很快成为一个性能问题;假设descr可以是任何东西,那么3是唯一的键,表在5nf中。此外,所述约束是转换约束,不排除任何特定的表值。重新设计:日志中缺少baseId;引入statusID与规范化无关;从log statusID到status id,您缺少FK,我假设从log baseId到logBase id;不清楚为什么logBase&baseID@philipxy主键([type]、[statusID]、[baseID])@Blam,你凭什么说原始设计“不是3NF”?就3NF而言,它似乎没有什么明显的问题。那么,与3NF无关。没有理由声称原始设计不在5NF中,更不用说3NF了。用ID替换值与规范化无关。