sql-server - SQL Server 中的唯一行约束

标签 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,
    [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]

并希望避免表中出现重复的行。我想过在整个表上创建一个 UNIQUE 索引,但 SQL Manager Studio 告诉我这是不可能的,因为键太大。

除了索引之外,还有其他方法可以在所有列上强制执行唯一行吗?

最佳答案

在哈希值上创建一个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,
        [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)

关于sql-server - SQL Server 中的唯一行约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9189705/

相关文章:

sql-server - SQL SELECT - 根据条件返回 bool 值

java - JDBC SQL Server 十进制 "invented"精度

mysql - MySQL 临时表应该建立索引(或者有主键)吗?

mysql - 我应该为 WHERE 子句中的所有字段添加索引吗? - MySQL

sql-server - 将一个表的数据与另一个表的数据进行比较的最佳方法是什么?

.net - 查询两个不同的服务器

sql - 选择唯一和选择不同之间的区别

sql-server - SQL Server Management Studio 2017 数据库图表文件夹丢失

sql-server - MSSQL 以固定值从一个表向另一个表插入数据

sql - 如何正确索引数据库以提高查询性能