sql >> Databáze >  >> RDS >> Sqlserver

Jak zjistit, zda v tabulce již existuje záznam se specifickým datovým typem IMAGE?

Nejúčinnější způsob, který mě napadá, je použít trvalý počítaný sloupec pro hash hodnotu sloupce obrázku. Použijte hashbytes vypočítat hash a přidat jedinečné omezení ve vypočítaném sloupci.

Definice tabulky:

create table Images
(
  ID int identity primary key, 
  Img varbinary(max),
  ImgHash as convert(varbinary(16), hashbytes('MD5', Img)) persisted unique
)

Ukázkový kód proti tabulce obrázků:

insert into Images values 
(convert(varbinary(max), 'Image1')),
(convert(varbinary(max), 'Image2'))

declare @NewImage varbinary(max) = convert(varbinary(max), 'Image2')

select count(*)
from Images
where ImgHash = hashbytes('MD5', @NewImage)

Jedinečné omezení vytvoří index, který bude použit v dotazu.

Váš SP pro přidání obrázku by mohl vypadat takto pomocí sloučení a výstup s trikem z této odpovědi AKTUALIZACE -no-op v příkazu SQL MERGE poskytuje Andriy M .

create procedure Images_Add
  @NewImage varbinary(max)
as  

declare @dummy int

merge Images as T
using (select @NewImage, hashbytes('MD5', @NewImage)) as S(Img, ImgHash)
on T.ImgHash = S.ImgHash
when not matched then
  insert(Img) values(S.Img)
when matched then
  update set @dummy = 0  
output inserted.ID;  



  1. SQL self-join pro vrácení konkrétních řádků

  2. Výjimka PDO:php_network_getaddresses:getaddrinfo se nezdařilo po změně překladačů DNS, přičemž DB běží na AWS

  3. Optimalizace dotazu (indexování, EXPLAIN) Mysql

  4. SQLite JSON_PATCH()