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 INTOdoloč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 KEYaliUNIQUE. - 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 KEYali - 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
REPLACEuporabljaj samo, kadar razumeš posledice nadomeščanja vrstice.- Pred uporabo preveri, ali ima tabela
PRIMARY KEYaliUNIQUE. - Če želiš spremeniti samo nekaj stolpcev, praviloma uporabi
UPDATE. - Pri stavku
REPLACEnavedi 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
REPLACEkot navadnega popravka obstoječe vrstice. - Uporaba
REPLACEnamestoUPDATE, kadar želimo spremeniti samo en stolpec. - Uporaba stavka
REPLACEv tabeli brezPRIMARY KEYaliUNIQUE. - 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.