Уникальное ограничение строк в SQL Server - PullRequest
5 голосов
/ 08 февраля 2012

У меня есть следующая таблица

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]

И хочу, чтобы в моей таблице не было повторяющихся строк. Я думал о создании УНИКАЛЬНОГО индекса для полной таблицы, но затем SQL Manager Studio сказал мне, что это невозможно, потому что ключ будет слишком большим.

Есть ли другой способ применения уникальных строк во всех столбцах, кроме индексов?

Ответы [ 2 ]

8 голосов
/ 08 февраля 2012

Создание индекса 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)
2 голосов
/ 08 февраля 2012

Используйте триггеры + меньший неуникальный индекс по наиболее различимым полям, чтобы справиться с проблемой таблицы.

Это очень сильно сказывается на плохом дизайне базы данных. Такие поля, как «Программное обеспечение» и «Учетная запись», изначально не входят в эту таблицу (или, если учетная запись, то не номер клиента). Ваша таблица только потому, что вы с самого начала нарушаете основы проектирования баз данных.

Кроме того, чтобы исключить неуникальные поля, у вас есть NT, чтобы в уникальном тестировании было поле Id, иначе у вас никогда не будет двойников для начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...