Načrtovanje in razvoj spletnih aplikacij

Zamenjava podatkov - REPLACE

Stavek REPLACE je podoben stavku INSERT, vendar ima posebno obnašanje ob konfliktu z obstoječim zapisom. Če v tabeli še ni zapisa z enako vrednostjo glavnega ključa ali enoličnega indeksa, se vstavi nova vrstica. Če tak zapis že obstaja, se stara vrstica odstrani in nato vstavi nova.

Zato stavek REPLACE ni enak stavku UPDATE. Pri UPDATE se obstoječi zapis spremeni, pri REPLACE pa se lahko obstoječi zapis najprej izbriše in nato znova vstavi.

Pomni: REPLACE je posebnost MySQL in MariaDB. Uporabljamo ga previdno, saj ob konfliktu ne popravi obstoječe vrstice, ampak jo lahko nadomesti z novo.

Stavek REPLACE je smiseln predvsem v tabelah, ki imajo določen PRIMARY KEY ali UNIQUE. Brez takšne omejitve se praviloma obnaša podobno kot navaden INSERT.

Vsebina strani

Osnovna pravila

Pri stavku REPLACE je treba razumeti, kaj se zgodi ob konfliktu z obstoječim zapisom. Konflikt nastane, kadar nova vrstica vsebuje vrednost, ki se ujema z obstoječim glavnim ključem ali enoličnim stolpcem.

  • REPLACE INTO določa tabelo, v katero želimo vstaviti oziroma nadomestiti zapis.
  • Če konflikt ne obstaja, se vstavi nova vrstica.
  • Če konflikt obstaja, se obstoječa vrstica odstrani in nato vstavi nova.
  • Konflikt se lahko zazna prek PRIMARY KEY ali UNIQUE.
  • Vrednosti, ki jih ne navedemo, se nastavijo na privzete vrednosti ali na NULL, če je to dovoljeno.

Pozor: Ker lahko REPLACE obstoječo vrstico izbriše in vstavi novo, lahko vpliva tudi na samodejne vrednosti, povezave, sprožilce in stolpce s privzetimi vrednostmi.

Osnovna ideja stavka REPLACE

Če v tabeli še ni vrstice z enako vrednostjo PRIMARY KEY ali UNIQUE, se REPLACE obnaša podobno kot INSERT. Če taka vrstica že obstaja, jo nadomesti.

To pomeni, da stavek REPLACE združuje dve možni dejanji:

  • vstavljanje nove vrstice, kadar enak zapis še ne obstaja,
  • nadomeščanje obstoječe vrstice, kadar pride do konflikta z enolično vrednostjo.

Osnovna sintaksa

Stavek REPLACE lahko zapišemo podobno kot INSERT:

REPLACE INTO ime_tabele (stolpec_1, stolpec_2, ..., stolpec_n)
VALUES (vrednost_1, vrednost_2, ..., vrednost_n);

Primer:

REPLACE INTO uporabniki (id, uporabnisko_ime, email)
VALUES (1, 'Ana', 'ana@example.com');

Če v tabeli uporabniki še ni vrstice z id = 1, se nova vrstica vstavi. Če taka vrstica že obstaja, jo REPLACE nadomesti z novo.

Pomni: Pri stavku REPLACE je priporočljivo navesti seznam stolpcev. Tako je jasneje, katere vrednosti se zapisujejo v katere stolpce.

Vloga glavnega ključa in enoličnega indeksa

Ukaz REPLACE je smiseln predvsem takrat, ko ima tabela:

  • glavni ključ PRIMARY KEY ali
  • enolični indeks UNIQUE.

Če tabela nima take omejitve, podatkovna baza ne zazna konflikta z obstoječim zapisom. V takem primeru se REPLACE praviloma obnaša podobno kot navaden INSERT.

REPLACE ni isto kot UPDATE

Pomembno je razumeti, da REPLACE ne popravi vrstice na enak način kot UPDATE. Če pride do konflikta, se stara vrstica izbriše in nato vstavi nova.

UPDATE uporabniki
SET email = 'ana@example.com'
WHERE id = 1;

Stavek UPDATE spremeni samo navedene stolpce obstoječe vrstice. Stavek REPLACE pa lahko zamenja celotno vrstico, zato se lahko vrednosti nenavedenih stolpcev izgubijo ali nastavijo na privzete vrednosti.

Pozor: REPLACE ni varna neposredna zamenjava za UPDATE. Če želimo popraviti samo en stolpec v obstoječi vrstici, je običajno primernejši UPDATE.

Primer z enoličnim stolpcem

V naslednjem primeru ima tabela uporabniki glavni ključ id in enoličen stolpec uporabnisko_ime:

CREATE TABLE uporabniki (
  id INT PRIMARY KEY,
  uporabnisko_ime VARCHAR(50) UNIQUE,
  email VARCHAR(100)
);

REPLACE INTO uporabniki (id, uporabnisko_ime, email)
VALUES (2, 'Miha', 'miha@example.com');

Če v tabeli že obstaja vrstica z enakim id ali enakim uporabnisko_ime, bo obstoječa vrstica nadomeščena.

Sorodnost s stavkom INSERT

Stavek REPLACE uporablja podobno sintakso kot INSERT. Zato lahko uporabljamo tudi podobne oblike, na primer z določenim seznamom stolpcev ali z več vrsticami vrednosti.

REPLACE INTO uporabniki (id, uporabnisko_ime, email)
VALUES (3, 'Sara', 'sara@example.com'),
       (4, 'Luka', 'luka@example.com');

Pri več vrsticah mora vsaka vrstica vrednosti ustrezati navedenim stolpcem.

Primerjava INSERT, UPDATE in REPLACE

Stavki INSERT, UPDATE in REPLACE so si na prvi pogled podobni, vendar imajo različne naloge.

Stavek Namen Pomembna značilnost
INSERT Vstavi novo vrstico v tabelo. Če pride do konflikta z enolično vrednostjo, se ukaz običajno ne izvede uspešno.
UPDATE Spremeni obstoječe vrstice. Spremeni samo stolpce, ki jih navedemo v delu SET.
REPLACE Vstavi novo vrstico ali nadomesti obstoječo. Ob konfliktu lahko obstoječo vrstico izbriše in vstavi novo.

Priporočila

  • REPLACE uporabljaj samo, kadar razumeš posledice nadomeščanja vrstice.
  • Pred uporabo preveri, ali ima tabela PRIMARY KEY ali UNIQUE.
  • Če želiš spremeniti samo nekaj stolpcev, praviloma uporabi UPDATE.
  • Pri stavku REPLACE navedi seznam stolpcev, da je ukaz preglednejši.
  • Preveri, kaj se zgodi s stolpci, ki jih v ukazu ne navedeš.
  • Pri pomembnih podatkih pred uporabo naredi varnostno kopijo ali uporabi testno tabelo.

Pogoste napake

  • Razumevanje stavka REPLACE kot navadnega popravka obstoječe vrstice.
  • Uporaba REPLACE namesto UPDATE, kadar želimo spremeniti samo en stolpec.
  • Uporaba stavka REPLACE v tabeli brez PRIMARY KEY ali UNIQUE.
  • Izpuščanje stolpcev, katerih vrednosti bi morale ostati nespremenjene.
  • Nepričakovana nastavitev nenavedenih stolpcev na privzete vrednosti ali NULL.
  • Neupoštevanje vpliva na povezane podatke, sprožilce ali samodejno številčenje.

Pri ukazu REPLACE moramo biti previdni. Ker lahko ob konfliktu izbriše obstoječo vrstico in vstavi novo, ni vedno primeren nadomestek za UPDATE.