Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
T-SQL唯一标识列作为复合主键的一部分_Sql_Sql Server_Tsql_Primary Key_Composite Primary Key - Fatal编程技术网

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替换值与规范化无关。