Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Уникальность значений в поле типа Image / 21 сообщений из 21, страница 1 из 1
10.09.2018, 11:46
    #39700329
Страдалецъ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность значений в поле типа Image
Как-то не сталкивался я раньше с необходимостью такой проверки, а теперь в легком недоумении как эту проверку реализовать средствами MS SQL. Уникальный индекс по данному полю сделать нельзя, а как тогда выкрутится?
...
Рейтинг: 0 / 0
10.09.2018, 12:00
    #39700337
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность значений в поле типа Image
Страдалецъ,

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

Код: 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
10.09.2018, 14:19
    #39700429
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность значений в поле типа Image
Тип 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
10.09.2018, 14:31
    #39700434
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность значений в поле типа Image
invm,

Мне кажется datalength все усложняет.
Достаточно и checksum если конечно у автора темы не гигантское кол-во строк в таблице.
...
Рейтинг: 0 / 0
10.09.2018, 14:37
    #39700436
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность значений в поле типа Image
Владимир ЗатуливетерМне кажется datalength все усложняет.Предлагаете проверять на совпадение два блоба, если у них одинаковый хеш, но разная длина?
...
Рейтинг: 0 / 0
10.09.2018, 15:23
    #39700465
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность значений в поле типа Image
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
10.09.2018, 15:36
    #39700475
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность значений в поле типа Image
Владимир ЗатуливетерДа, т.к. вероятность такого совпадения ооооочень мала.
Подход checksum + datalength оправдан только на большом кол-во строк, когда появляются дубликаты по checksum.Вероятность появления дубликатов зависит от данных, а не от количества строк.
В моем примере как раз это и показано.
...
Рейтинг: 0 / 0
10.09.2018, 16:02
    #39700492
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность значений в поле типа Image
invmВероятность появления дубликатов зависит от данных, а не от количества строк.
не понял, о чем это вы?

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

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

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

Я думаю смысла нет дальше продолжать нашу дисскусию, вроде бы понятна и моя и ваша точка зрения, понятны все плюсы и минусы предложенных решений.
У автора темы будет из чего выбрать.
Мы сюда пришли помогать людям, а не срач в темах разводить.
Ща уже модераторы проснуться и ругаться будут.
...
Рейтинг: 0 / 0
10.09.2018, 18:20
    #39700589
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность значений в поле типа Image
Владимир ЗатуливетерНу я про тоже, от того они и получаются более сложными чем это необходимо.Не зная как именно необходимо, невозможно эту необходимость оценивать. А вы именно этим и занимаетесь, гадая и основываясь на неверных посылках.
В частности, вы исходите из неверного понимания назначения хеша.
...
Рейтинг: 0 / 0
10.09.2018, 19:03
    #39700613
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность значений в поле типа Image
ну почему тогда все возможные варианты не учтены у вас?
надо из реальных задач исходить, смысл решать несуществующие? я только это хочу сказать.
Код: 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
10.09.2018, 19:44
    #39700632
Страдалецъ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность значений в поле типа Image
С интересом прочитал всю ветку, даже не ожидал столь бурной полемики по этому вопросу. Спасибо всем за подсказки и полезные советы. Собственно в базе хранится будут фотографии, в основном портретного формата. В процессе работы с подобными базами всегда сталкивался с необходимостью находить и удалять повторяющиеся изображения. Сейчас хочу эту ситуацию пресечь на корню.
...
Рейтинг: 0 / 0
10.09.2018, 19:45
    #39700633
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность значений в поле типа Image
Владимир Затуливетернадо из реальных задач исходить, смысл решать несуществующие?Вот именно. Особенно, если придумывать подходящие под собственные решения.

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


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