powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Уникальность значений в поле типа Image
21 сообщений из 21, страница 1 из 1
Уникальность значений в поле типа Image
    #39700329
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то не сталкивался я раньше с необходимостью такой проверки, а теперь в легком недоумении как эту проверку реализовать средствами MS SQL. Уникальный индекс по данному полю сделать нельзя, а как тогда выкрутится?
...
Рейтинг: 0 / 0
Уникальность значений в поле типа Image
    #39700337
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Страдалецъ,

HASHBYTES вызвать для колонки
...
Рейтинг: 0 / 0
Уникальность значений в поле типа Image
    #39700379
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. завести поле под контрольную сумму и в тригере на добавление его заполнять этой функцией?
...
Рейтинг: 0 / 0
Уникальность значений в поле типа Image
    #39700407
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СтрадалецъТ.е. завести поле под контрольную сумму и в тригере на добавление его заполнять этой функцией?Надо ещё совпадения обрабатывать - ведь хэшкод или конрольная сумма неуникальны
...
Рейтинг: 0 / 0
Уникальность значений в поле типа Image
    #39700427
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не проверял, но должно работать.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
create table dbo.TableName (
	Id int identity primary key,
	Data varbinary(max),
	DataHash as checksum(Data) --persisted не надо если будет индекс по этому полю
)
go

create index IDX_TableName_DataHash 
on dbo.TableName ( DataHash )
go

-- в процедуре которая обновляет данные
if exists ( select *
            from dbo.TableName
            where DataHash = checksum(@NewData) and Data = @NewData )
    throw 50001, 'Невозможно вставить дубликат Data!', 1;

-- или в триггере 
if exists ( select *
            from Inserted i
                join dbo.TableName t on i.DataHash = t.DataHash
                                    and i.Data = t.Data )
    throw 50001, 'Невозможно вставить дубликат Data!', 1;
...
Рейтинг: 0 / 0
Уникальность значений в поле типа Image
    #39700429
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тип image необходимо изменить на varbinary(max), иначе ничего не выйдет.

Реализвать проверку можно примерно так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
use tempdb;
go

create table dbo.t (id int identity primary key, s varbinary(max), tag1 as checksum(s), tag2 as datalength(s));
create index IX_t__tag1__tag2 on dbo.t (tag1, tag2);
go

create trigger dbo.tr_t__check_uniqueness
on dbo.t
after insert, update
as
begin
 set nocount on;

 if not exists(select 1 from inserted)
  return;
 
 if exists(select 1 from inserted i join dbo.t t on t.tag1 = i.tag1 and t.tag2 = i.tag2 where i.id <> t.id and i.s = t.s)
  begin
   raiserror('Нарушена уникальность столбца s', 16, 2);
   rollback;
   return;
  end;
end;
go

if object_id('tempdb..#s', 'U') is not null
 drop table #s;

declare
 @s1 varbinary(max) = cast(replicate(cast(0x01 as varbinary(max)), 9000) as varbinary(max)),
 @s2 binary(8000) = cast(replicate(0x01, 8000) as binary(8000)),
 @s3 binary(8000) = cast(replicate(0x02, 8000) as binary(8000));

declare
 @s4 varbinary(max) = convert(varbinary(max), convert(varchar(max), @s2, 2) + convert(varchar(max), @s2, 2), 2),
 @s5 varbinary(max) = convert(varbinary(max), convert(varchar(max), @s2, 2) + convert(varchar(max), @s3, 2), 2);

select s into #s from (values (@s1), (@s2), (@s3), (@s4), (@s5)) a(s);
go

insert into dbo.t (s) select s from #s;
go

insert into dbo.t (s) select top (1) s from #s;
go

select * from dbo.t;
go

drop table dbo.t;
go

...
Рейтинг: 0 / 0
Уникальность значений в поле типа Image
    #39700434
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Мне кажется datalength все усложняет.
Достаточно и checksum если конечно у автора темы не гигантское кол-во строк в таблице.
...
Рейтинг: 0 / 0
Уникальность значений в поле типа Image
    #39700436
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир ЗатуливетерМне кажется datalength все усложняет.Предлагаете проверять на совпадение два блоба, если у них одинаковый хеш, но разная длина?
...
Рейтинг: 0 / 0
Уникальность значений в поле типа Image
    #39700465
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Да, т.к. вероятность такого совпадения ооооочень мала.
Подход checksum + datalength оправдан только на большом кол-во строк, когда появляются дубликаты по checksum. Поэтому не вижу смылса усложнять код в большинстве случаев.

Вот нагуглил ответ с цифрами. Для 32-х битных хешей кол-во хешируемых значений должно быть меньшь 250 тыс., на таком кол-ве вероятность появления дубликата при вставке уже близка к 100%.
https://stackoverflow.com/questions/37343529/how-many-rows-can-you-have-when-using-checksum-as-primary-key

я ожидал больших значений, не учел парадокс дней рождения
...
Рейтинг: 0 / 0
Уникальность значений в поле типа Image
    #39700475
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир ЗатуливетерДа, т.к. вероятность такого совпадения ооооочень мала.
Подход checksum + datalength оправдан только на большом кол-во строк, когда появляются дубликаты по checksum.Вероятность появления дубликатов зависит от данных, а не от количества строк.
В моем примере как раз это и показано.
...
Рейтинг: 0 / 0
Уникальность значений в поле типа Image
    #39700492
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmВероятность появления дубликатов зависит от данных, а не от количества строк.
не понял, о чем это вы?

чем больше мы вставляем в таблицу значений рандомных, тем больше вероятность получить дупликат хеша для этих значений.
...
Рейтинг: 0 / 0
Уникальность значений в поле типа Image
    #39700505
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Затуливетерне понял, о чем это вы?

чем больше мы вставляем в таблицу значений рандомных, тем больше вероятность получить дупликат хеша для этих значений.Видимо пример так и не запускали...
...
Рейтинг: 0 / 0
Уникальность значений в поле типа Image
    #39700513
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запустил сейчас и внимательно посмотрел.
Я так понимаю вы про нули в tag1?
Ну блин, так не пойдет, это синтетические, специально подобранные данные, в реальной жизни набор байт случайный.
...
Рейтинг: 0 / 0
Уникальность значений в поле типа Image
    #39700528
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир ЗатуливетерНу блин, так не пойдет, это синтетические, специально подобранные данные, в реальной жизни набор байт случайный.Да ну? Вы в курсе какие реальные данные у ТС и насколько часто они будут давать дубликаты по хешу?
...
Рейтинг: 0 / 0
Уникальность значений в поле типа Image
    #39700538
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а вы в курсе видимо?

Давайте подождем автора, он нам расскажет.
...
Рейтинг: 0 / 0
Уникальность значений в поле типа Image
    #39700544
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир ЗатуливетерНу а вы в курсе видимо?А мне не надо быть в курсе.
Я не строю решение на неподтвержденных предположениях и анализе вероятностей.
...
Рейтинг: 0 / 0
Уникальность значений в поле типа Image
    #39700570
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну я про тоже, от того они и получаются более сложными чем это необходимо.

Я думаю смысла нет дальше продолжать нашу дисскусию, вроде бы понятна и моя и ваша точка зрения, понятны все плюсы и минусы предложенных решений.
У автора темы будет из чего выбрать.
Мы сюда пришли помогать людям, а не срач в темах разводить.
Ща уже модераторы проснуться и ругаться будут.
...
Рейтинг: 0 / 0
Уникальность значений в поле типа Image
    #39700589
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир ЗатуливетерНу я про тоже, от того они и получаются более сложными чем это необходимо.Не зная как именно необходимо, невозможно эту необходимость оценивать. А вы именно этим и занимаетесь, гадая и основываясь на неверных посылках.
В частности, вы исходите из неверного понимания назначения хеша.
...
Рейтинг: 0 / 0
Уникальность значений в поле типа Image
    #39700613
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну почему тогда все возможные варианты не учтены у вас?
надо из реальных задач исходить, смысл решать несуществующие? я только это хочу сказать.
Код: sql
1.
2.
3.
4.
with t(n) as ( select 1 union all select n+1 from t where n < 1000 )
select d.val, checksum(val), datalength(val)
from t cross apply ( select cast(replicate(cast(n as varbinary(max)), 8000) as varbinary(max)) ) d(val)
option(maxrecursion 0)
...
Рейтинг: 0 / 0
Уникальность значений в поле типа Image
    #39700632
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С интересом прочитал всю ветку, даже не ожидал столь бурной полемики по этому вопросу. Спасибо всем за подсказки и полезные советы. Собственно в базе хранится будут фотографии, в основном портретного формата. В процессе работы с подобными базами всегда сталкивался с необходимостью находить и удалять повторяющиеся изображения. Сейчас хочу эту ситуацию пресечь на корню.
...
Рейтинг: 0 / 0
Уникальность значений в поле типа Image
    #39700633
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Затуливетернадо из реальных задач исходить, смысл решать несуществующие?Вот именно. Особенно, если придумывать подходящие под собственные решения.

ЗЫ: Подумайте на досуге: для чего придумали хеш-таблицы.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Уникальность значений в поле типа Image
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]