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
),您可以直接添加它们,而不是散列。