anglojęzyczne książki w polsce … nice try, empik :)

empik zaczął sprzedawać na większą skalę książki anglojęzyczne.

super – czyż nie? nie.

chciałem ostatnio kupić (i finalnie kupiłem, a dokładniej kupiono mi), książkę “sql cookbook" z o'reillyego.

książkę można kupić w barnes & noble no i teraz w empiku. tyle, że w b&n kosztuje $32, a w empiku 152pln (trochę ponad $50). niezłe przebicie. co prawda – dostaje się ją za to szybciej – empik pisze, że wysyła w 2-3 dni, a barnes and noble napisał jedynie: Delivery estimate: May 17, 2006 – June 1. ale jednak wolę te kilka dni poczekać niż płacić 2 razy tyle …

wstawianie rekordu, gdy jeszcze go nie ma

kolega z pracy zapytał:

jak wstawić rekord do tabelki, ale tylko jeśli go tam jeszcze nie ma?

teoretycznie sprawa jest prosta: select, jak nic nie zwróci – insert. no ale jak będzie to działało równolegle to jest spora szansa na wysypanie się takiego kodu.

potrzebna jest więc inna metoda.

może insert i przechwycenie błędu.

w sumie to nie takie głupie:

  • BEGIN;
  • INSERT;
  • COMMIT;

jeśli insert się nie udał, no to commit zrobi to samo co rollback.

fajnie. zadziała. ale jest jakoś mało eleganckie.

a może inaczej … chwila zastanowienia i … jest. proste rozwiązanie:

INSERT INTO tabelka (pole_1, pole_2, …, pole_n)
SELECT wartosc_1, wartosc_2, …, wartosc_n
WHERE NOT EXISTS ( SELECT * FROM tabelka WHERE pole_1 = wartosc_1 AND pole_2 = wartosc_2 AND … AND pole_n = wartosc_n);

nie jest to może najśliczniejsze, ale działa na pewno. nie wywala się niezależnie od tego czy wstawiło czy nie (więc można bezpiecznie używać w transakcjach). same plusy 🙂