sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan bestemmer man, om en post med en bestemt IMAGE-datatype allerede findes i tabellen?

Den mest effektive måde, jeg kan komme i tanke om, er at bruge en vedvarende beregnet kolonne for en hashværdi for billedkolonnen. Brug hashbytes for at beregne hashen og tilføje en unik begrænsning på den beregnede kolonne.

Tabeldefinition:

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

Eksempelkode mod billedtabellen:

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)

Den unikke begrænsning opretter et indeks, der vil blive brugt i forespørgslen.

Din SP til at tilføje et billede kunne se sådan ud ved at bruge flet og output med et trick fra dette svar OPDATERING -no-op i SQL MERGE-sætning leveret af 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. Hvordan sammenligner jeg (OG) to strenge, der repræsenterer en binær maske i mysql?

  2. Valgfri måned eller dag i MySQL-datofeltet fra PHP

  3. Opdater tidsstempel, når rækken er opdateret i PostgreSQL

  4. PHP og MySQL - hvordan undgår man adgangskode i kildekoden?