UPDATE: ändra rader
Någon byter adress. En order skickas. Ett pris höjs. Data som redan finns behöver ändras hela tiden.
UPDATE är också det kommando som har förstört flest databaser. Inte för att det är svårt, utan för att det är så lätt att glömma en enda rad. Den här sidan handlar lika mycket om hur du använder UPDATE säkert som om hur det fungerar.
Exemplen använder övningsdatan, plus Främlingen från INSERT-sidan. Har du inte Främlingen kan du lägga till hen så här:
INSERT INTO person (name, job, gold, village_id)VALUES ('Främling', NULL, 0, 1);Vad gör UPDATE?

UPDATE personSET gold = gold + 100WHERE id = 6;På svenska:
I tabellen person, sätt gold till det gamla värdet plus 100, men bara på raden med id 6.

Ett UPDATE har tre delar:
| Del | Säger |
|---|---|
UPDATE person | vilken tabell |
SET gold = gold + 100 | vad som ska ändras |
WHERE id = 6 | vilka rader |
gold = gold + 100 eller gold = 100?
gold = gold + 100 läser det gamla värdet, lägger till 100 och skriver tillbaka resultatet. Om Främlingen hade 40 får hen 140.
gold = 100 skriver över. Om Främlingen hade 40, eller 4000, får hen 100.
Båda är rätt, men de gör olika saker. Läs frågan högt och kontrollera att den säger det du menar.
Flera kolumner på en gång

UPDATE personSET name = 'Fia', job = 'baker'WHERE id = 6;Kolumnerna i SET separeras med kommatecken. Skriv inte AND mellan dem. SET name = 'Fia' AND job = 'baker' betyder något helt annat, och det blir fel.
Filtrera på id
Det kan finnas två personer som heter Fia. Det kan aldrig finnas två med id 6.
-- ⚠️ Ändrar alla som heter FiaUPDATE person SET gold = 0 WHERE name = 'Fia';
-- ✅ Ändrar exakt en radUPDATE person SET gold = 0 WHERE id = 6;När du vill ändra en sak, filtrera på primärnyckeln.
Ibland vill du förstås ändra många rader på en gång, och då är ett bredare WHERE helt rätt:
UPDATE personSET gold = gold + 10WHERE job = 'baker';⚠️ Utan WHERE

UPDATE personSET gold = 0; -- glömde WHERE...Alla rader ändras. Ingen varning och ingen ångra-knapp.
Det här är inte en teoretisk risk. Det är en av de vanligaste orsakerna till att produktionsdata förstörs. Det räcker att markera bara den första raden av frågan i ett databasverktyg och trycka på Kör.
Den gyllene regeln

-
Skriv
SELECTmed dittWHEREförstSELECT * FROM person WHERE job = 'baker'; -
Ser raderna rätt ut? Byt då bara början
UPDATE person SET gold = gold + 10 WHERE job = 'baker';
Samma WHERE ger samma rader. Du vet vad du ändrar innan du ändrar det.
Skyddsnät: transaktion
BEGIN TRANSACTION;
UPDATE person SET gold = gold + 10 WHERE job = 'baker';
SELECT * FROM person; -- ser det rätt ut?
COMMIT; -- ja, spara-- ROLLBACK; -- nej, ångra allt sedan BEGINInuti en transaktion kan du titta på resultatet innan något sparas på riktigt. Mer om det i Transaktioner.
UPDATE med en subquery
Du vet byns namn, men inte dess id:
UPDATE personSET village_id = (SELECT id FROM village WHERE name = 'Gurkby')WHERE id = 6;Subqueryn översätter namnet till ett id. Mer om subqueries på sidan Subquery.
Clean Code: UPDATE
Så här skriver du UPDATE som går att lita på.
-- ❌ Allt på en rad, och lätt att råka köra bara halvaupdate person set gold=gold+10,job='baker' where name='Fia'-- ✅ En del per rad, och filtrerat på idUPDATE personSET gold = gold + 10, job = 'baker'WHERE id = 6;WHEREpå egen rad. Då syns det direkt om det saknas.- Filtrera på id när du menar en rad
- En kolumn per rad i
SETnär du ändrar flera SELECTförst, och gärna en transaktion
Vanliga misstag
| Misstag | Vad händer? | Gör så här i stället |
|---|---|---|
Glömt WHERE | Alla rader ändras | SELECT med samma WHERE först |
WHERE name = 'Fia' när du menar en person | Alla som heter Fia ändras | WHERE id = 6 |
SET gold = 100 när du menar “lägg till 100” | Det gamla värdet skrivs över | SET gold = gold + 100 |
SET name = 'Fia' AND job = 'baker' | Tolkas som name = ('Fia' AND job = 'baker'). I SQLite blir name då texten '0', och job ändras inte. | Kommatecken mellan kolumnerna |
SET job = 'NULL' | Kolumnen får texten NULL | SET job = NULL, utan citattecken |
Sammanfattning
UPDATE tabell SET kolumn = värde WHERE villkorändrar befintliga rader.SETsäger vad ochWHEREsäger vilka.gold = gold + 100räknar från det gamla värdet.gold = 100skriver över.- Flera kolumner separeras med kommatecken.
- Utan
WHEREändras alla rader. SELECTmed sammaWHEREförst, och gärna en transaktion.
Övningar
Kör övningsdatan innan du börjar.
🟢 Övning 1: Cissi får betalt
Cissi har sålt bröd och tjänat 20 guld. Uppdatera hennes guld.
💡 Klicka här för ett lösningsförslag
Din lösning kan se annorlunda ut och ändå vara helt korrekt!
SELECT * FROM person WHERE id = 3; -- kontrollera först
UPDATE personSET gold = gold + 20WHERE id = 3;Cissi går från 80 till 100. gold + 20 räknar från det hon redan har.
🟡 Övning 2: Eva flyttar
Eva flyttar till Lökby. Uppdatera hennes rad.
💡 Klicka här för ett lösningsförslag
Din lösning kan se annorlunda ut och ändå vara helt korrekt!
UPDATE personSET village_id = 1WHERE id = 5;Med en subquery slipper du veta Lökbys id:
UPDATE personSET village_id = (SELECT id FROM village WHERE name = 'Lökby')WHERE id = 5;🟡 Övning 3: Byte av bana
David tröttnar på att flyga. Han blir bagare och flyttar till Morotsby. Gör det med en UPDATE.
💡 Klicka här för ett lösningsförslag
Din lösning kan se annorlunda ut och ändå vara helt korrekt!
UPDATE personSET job = 'baker', village_id = 3WHERE id = 4;🔴 Övning 4: Bonus till bagarna, säkert
Alla bagare i Lökby ska få 50 guld extra. Gör det så säkert som möjligt: kontrollera vilka rader som påverkas, gör ändringen så att den kan ångras och kontrollera resultatet innan du sparar. Använd byns namn, inte dess id.
💡 Klicka här för ett lösningsförslag
Din lösning kan se annorlunda ut och ändå vara helt korrekt!
-- 1. Vilka rader gäller det?SELECT *FROM personWHERE job = 'baker' AND village_id = (SELECT id FROM village WHERE name = 'Lökby');
-- 2. Ändra inuti en transaktionBEGIN TRANSACTION;
UPDATE personSET gold = gold + 50WHERE job = 'baker' AND village_id = (SELECT id FROM village WHERE name = 'Lökby');
-- 3. KontrolleraSELECT name, gold FROM person;
-- 4. Spara (eller ROLLBACK om något blev fel)COMMIT;Anna går från 120 till 170 och Cissi från 80 till 130.
Här samlas allt: den gyllene regeln (SELECT först), en subquery som översätter bynamnet till ett id, gold = gold + 50 i stället för att skriva över, och en transaktion som skyddsnät.
Föregående: INSERT · Tillbaka till översikten · Nästa: DELETE