Sql server SQL Server中的唯一行约束
我有下表Sql server SQL Server中的唯一行约束,sql-server,tsql,indexing,unique,Sql Server,Tsql,Indexing,Unique,我有下表 CREATE TABLE [dbo].[LogFiles_Warehouse]( [id] [int] IDENTITY(1,1) NOT NULL, [timestamp] [datetime] NOT NULL, [clientNr] [int] NOT NULL, [server] [nvarchar](150) COLLATE Latin1_General_CI_AS NOT NULL, [storeNr] [int] NOT NULL,
CREATE TABLE [dbo].[LogFiles_Warehouse](
[id] [int] IDENTITY(1,1) NOT NULL,
[timestamp] [datetime] NOT NULL,
[clientNr] [int] NOT NULL,
[server] [nvarchar](150) COLLATE Latin1_General_CI_AS NOT NULL,
[storeNr] [int] NOT NULL,
[account] [nvarchar](50) COLLATE Latin1_General_CI_AS NOT NULL,
[software] [nvarchar](300) COLLATE Latin1_General_CI_AS NOT NULL,
CONSTRAINT [PK_Astoria_LogFiles_Warehouse] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
并希望避免表中出现重复行。我曾考虑在完整的表上创建一个唯一的索引,但后来SQLManagerStudio告诉我这是不可能的,因为键太大了
除了索引之外,还有其他方法可以在所有列上强制使用唯一行吗?使用触发器+在最显著的ield上使用较小的非唯一索引来帮助解决表的问题 首先,这会导致糟糕的数据库设计。像Software、Account这样的字段不属于该表(或者如果是Account,则不属于client nr)。您的表之所以如此杂乱,是因为您从数据库设计的基础知识开始
此外,要避免非唯一字段,您必须在唯一测试中使用Id字段,否则您就永远不会有双精度的开始。对散列值创建一个
唯一的
索引:
CREATE TABLE [dbo].[LogFiles_Warehouse]
(
[id] [int] IDENTITY(1,1) NOT NULL,
[timestamp] [datetime] NOT NULL,
[clientNr] [int] NOT NULL,
[server] [nvarchar](150) COLLATE Latin1_General_CI_AS NOT NULL,
[storeNr] [int] NOT NULL,
[account] [nvarchar](50) COLLATE Latin1_General_CI_AS NOT NULL,
[software] [nvarchar](300) COLLATE Latin1_General_CI_AS NOT NULL,
serverHash AS CAST(HASHBYTES('MD4', server) AS BINARY(16)),
accountHash AS CAST(HASHBYTES('MD4', account) AS BINARY(16)),
softwareHash AS CAST(HASHBYTES('MD4', software) AS BINARY(16))
)
CREATE UNIQUE INDEX
UX_LogFilesWarehouse_Server_Account_Software
ON LogFiles_Warehouse (serverHash, accountHash, softwareHash)
您想要基于哪些列的唯一行?当然,具有标识意味着将不会有唯一行,您是在讨论列其余部分的唯一行吗?您能告诉我们这样一个约束的好处是什么吗?对于timestamp和clientNr等字段,我怀疑您是否能够获得重复的行。这些数据是用户可以导入的日志文件。但是,当两个用户导入相同的日志文件时,我希望避免数据被插入两次。这只是一个保存日志文件值的表。所有字段之间都没有函数、传递、多值或任何其他依赖关系。当然,这意味着永远不会有两个相同的行-但是,随着日志文件的导入,用户可以导入相同的日志文件两次,从而创建两个相同的行。散列完整的行并在该散列上创建索引不是更容易吗?@Florian:谁更容易,如何“散列完整的行”?3个16字节字段的索引对服务器来说不是问题。如果你要连接所有的值,那么它可能会造成混淆,比如说,
server=MSSQLServer,account=20081
和server=MSSQLServer2008,account=1
。好的,这是有道理的。我可以将其他行也添加到索引中吗?(即timestamp、clientnr和storenr)这样索引将有效地覆盖最后的所有列?当然没有身份。@Florian:当然。如果它们不是varchar(比如INT
或DATE
),您可以直接添加它们,而不是散列。