Den Insert auf einen Fehler laufen zu lassen ist (meistens) besser, da zwischen dem "select count(*)" und dem Insert ein anderer Job den Insert durchführen kann.
Der Select gibt zwar den momentanen Stand, der kann sich aber Millisekunden später schon ändern.

Der Select ist schnell, wenn es über die Felder der where-Bedingung eine LF (Index) gibt.