SQL Server уникальный набор столбцов без ограничения - получение бита до предела 900 байт - PullRequest
1 голос
/ 13 октября 2008

У меня есть таблица, которая содержит 3 столбца nvarchar (255), и комбинация этих 3 столбцов должна быть уникальной. Обычно я создаю ограничение Unique, но в этом случае я достигаю предела в 900 байт. Поскольку я должен поддерживать SQL Server 2000, я не могу использовать столбцы включения, чтобы обойти эту ситуацию.

Ответы [ 6 ]

3 голосов
/ 13 октября 2008

Если я вас правильно понимаю, вы можете использовать триггер и проверить вставку или обновление, чтобы проверить, является ли комбинация значений уникальной перед внесением изменения. Вы также можете сделать то же самое с помощью хранимой процедуры.

0 голосов
/ 14 октября 2008

У меня нет доступа к SQL 2000 Server, поэтому я не мог проверить это там, но предполагая, что он поддерживает скалярные функции, он должен работать Вы можете сделать это быстрее, добавив неуникальные индексы в каждый столбец, чтобы не выполнять сканирование таблицы.

CREATE FUNCTION [dbo].[fn_count_rows_for_ids]
(
    @id1 nvarchar(255),
    @id2 nvarchar(255),
    @id3 nvarchar(255)
)
RETURNS int
AS
BEGIN
    DECLARE @count int

    SELECT @count = count(*) FROM tbl_test WHERE (string_1 = @id1 AND string_2 = @id2 AND string_3 = @id3)

    RETURN @count

END

CREATE TABLE [dbo].[tbl_test](
    [string_1] [nvarchar](255) NOT NULL,
    [string_2] [nvarchar](255) NOT NULL,
    [string_3] [nvarchar](255) NOT NULL
) ON [PRIMARY]

ALTER TABLE [dbo].[tbl_test]  WITH CHECK ADD  CONSTRAINT [CK_tbl_test] CHECK  (([dbo].[fn_count_rows_for_ids]([string_1],[string_2],[string_3])<=(1)))

ALTER TABLE [dbo].[tbl_test] CHECK CONSTRAINT [CK_tbl_test]
0 голосов
/ 13 октября 2008

Работал над этим параллельно, но похоже, что это расширение некоторых других уже предложенных идей ... Вы должны быть в состоянии создать индексированное представление, используя CHECKSUM, чтобы справиться с этим.

Как пример:

CREATE TABLE dbo.Test_Unique_Limit (
    string_1    NVARCHAR(255)   NOT NULL,
    string_2    NVARCHAR(255)   NOT NULL,
    string_3    NVARCHAR(255)   NOT NULL )
GO
CREATE VIEW dbo.Test_Unique_Limit_View
WITH SCHEMABINDING
AS
    SELECT string_1, string_2, string_3, CHECKSUM(string_1, string_2, string_3) AS CHKSUM
    FROM dbo.Test_Unique_Limit
GO
CREATE UNIQUE CLUSTERED INDEX Test_Unique_Limit_IDX ON dbo.Test_Unique_Limit_View (CHKSUM)
GO

Я не использовал этот метод в производстве, поэтому я не могу поручиться ни за его производительность, ни за полную точность. Вам нужно будет провести собственное тестирование там.

Одна вещь, которую я укажу, хотя ... тот факт, что вы сталкиваетесь с этой проблемой, заставит вас сделать шаг назад и подумать, действительно ли сама модель так хороша, как должна быть. Уникальный индекс для столбцов, который вы описали, кажется немного странным.

Удачи!

0 голосов
/ 13 октября 2008

Еще одна идея: не могли бы вы добавить столбец, в котором хранится хеш этих значений вместе? SQL 2000 поддерживает расширенную хранимую процедуру для сумм md5, которые можно вызвать из триггера для создания хэша.

0 голосов
/ 13 октября 2008

Вы можете хэшировать 3 столбца, используя MD5 или SHA1, и создавать ограничение unqiue для хэшированного значения.

Насколько это легко реализовать, зависит от того, откуда вы ВСТАВЛЯЕТЕ / ОБНОВЛЯЕТЕ.

Если они исходят только из вашего приложения, то это должно быть относительно легко реализовать.

Если они получены из нескольких источников, вы можете посмотреть на реализацию хэша в T-SQL. Быстрый поиск в Google показал следующую реализацию MD5 в T-SQL: http://binaryworld.net/Main/CodeDetail.aspx?CodeId=3600. В SQL2005 вы можете использовать встроенную хеш-функцию: http://msdn.microsoft.com/en-us/library/ms174415.aspx.

Обратите внимание, что MD5 больше не считается "безопасным", хотя этого должно быть достаточно для этого сценария. Он работает быстрее и проще в реализации, чем SHA1.

0 голосов
/ 13 октября 2008

255 кажется довольно произвольным. Имея это в виду, есть ли шанс, что nvarchar (150) будет адекватным? Или какая-то комбинация, которая приводит к <= 900 байтов? </p>

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