Osvojte si umění aktualizace databázových záznamů pomocí příkazu SQL UPDATE.
Jako softwaroví inženýři, práce s relačními databázemi je pro vás nezbytná dovednost. SQL, neboli Structured Query Language, je intuitivní a uživatelsky přívětivý jazyk s jednoduchou syntaxí. Umožňuje vám manipulovat s databázovými objekty a provádět dotazy nad tabulkami relačních databází.
Pomocí SQL dotazů můžete vytvářet, číst, aktualizovat a mazat záznamy v tabulkách databáze. Tyto operace se souhrnně označují jako CRUD operace.
Pro úpravu stávajících záznamů v databázi použijete v SQL příkaz UPDATE.
V tomto tutoriálu se dozvíte:
- Jaká je syntaxe příkazu UPDATE.
- Jak selektivně aktualizovat záznamy na základě specifické podmínky, případně více podmínek spojených logickými operátory.
- Na co si dát pozor, abyste předešli nechtěným následkům při používání SQL příkazu UPDATE.
Syntaxe příkazu SQL UPDATE
Základní struktura příkazu SQL UPDATE je:
UPDATE název_tabulky SET sloupec = nová_hodnota WHERE podmínka;
Tento dotaz modifikuje hodnotu sloupce ve všech záznamech, které splňují zadanou podmínku.
Pokud potřebujete aktualizovat více sloupců současně, použijte následující formát:
UPDATE název_tabulky SET sloupec_1 = nová_hodnota_1, sloupec_2 = nová_hodnota_2, ..., sloupec_k = nová_hodnota_k WHERE podmínka;
V relačních databázích platí, že:
- Tabulka reprezentuje entitu.
- Řádky tabulky, nazývané záznamy, představují jednotlivé instance dané entity.
- Sloupce, někdy nazývané i pole nebo atributy, popisují vlastnosti entity. V tomto textu budeme termíny sloupce a pole používat zaměnitelně.
Příklady použití příkazu SQL UPDATE
Podívejme se na praktické příklady použití.
Předpoklady
Než začnete s kódováním, ujistěte se, že máte:
- Nainstalované SQLite. Pro tento tutoriál doporučujeme SQLite Database Browser. Alternativně můžete použít i MySQL nebo PostgreSQL.
- Pokud chcete replikovat kompletní příklad, budete potřebovat Python a Faker Python package.
Vytvoření databázové tabulky se záznamy
Pro účely tohoto tutoriálu si vytvoříme databázi zákazníků `customer_db.db`. Následující fragment kódu v Pythonu vygeneruje databázi a tabulku s fiktivními daty pomocí knihovny Faker:
import sqlite3 from faker import Faker import random # Připojení k databázi conn = sqlite3.connect('customer_db.db') cur = conn.cursor() # Vytvoření tabulky cur.execute('''CREATE TABLE customers ( customerID INTEGER PRIMARY KEY, name TEXT, city TEXT, email TEXT, num_orders INTEGER, discount INTEGER DEFAULT 2)''') # Inicializace Faker fake = Faker() Faker.seed(42) for _ in range(15): name = fake.name() city = fake.city() domain = fake.domain_name() email = f"{name[:2]}.{city[:2]}@{domain}" num_orders = random.choice(range(200)) cur.execute('INSERT INTO customers (name, city, email, num_orders) VALUES (?,?,?,?)', (name,city,email,num_orders)) # Uložení změn conn.commit() cur.close() conn.close()
⚠️ Pro bezproblémové spuštění kódu se ujistěte, že máte Python 3.7 (nebo novější) a Faker nainstalované ve vašem vývojovém prostředí. Knihovnu Faker nainstalujete pomocí pip:
pip install faker
Pokud již máte databázi a tabulku, kterou chcete použít, můžete tento krok přeskočit a použít je.
Spuštění našeho prvního SQL dotazu
Tabulka zákazníků obsahuje následující pole:
- `customerID`: Primární klíč, který jednoznačně identifikuje záznam.
- `name`: Jméno zákazníka.
- `city`: Město, kde zákazník bydlí.
- `email`: Emailová adresa zákazníka.
- `num_orders`: Počet objednávek, které zákazník učinil.
- `discount`: Procentuální sleva (celé číslo), s výchozí hodnotou 2. Díky výchozí hodnotě není nutné tuto hodnotu zadávat při vkládání nových záznamů.
📝 Pro spouštění dotazů a prohlížení výsledků můžete použít příkazový řádek SQLite nebo specializovaný nástroj, jako je SQLite Database Browser, který používáme v tomto tutoriálu.
Dotazem na všechny záznamy získáte kompletní obsah tabulky:
SELECT * FROM customers;
V reálné praxi byste se měli vyhnout použití `SELECT *`, pokud to není nezbytně nutné. Pro tento demonstrační příklad je ale použití vhodné, jelikož máme pouze 15 záznamů a malý počet sloupců.
Aktualizace záznamů na základě jedné podmínky
Nyní, když víme, jak tabulka vypadá, můžeme vyzkoušet několik příkazů UPDATE pro aktualizaci záznamů na základě specifických podmínek.
📋 Poznámka: Po provedení každého příkazu UPDATE vždy znovu spustíme `SELECT * FROM customers`, abychom viděli změny.
Aktualizace jednoho pole
Nejprve aktualizujeme pole `city` pro záznam s `customerID = 7`:
UPDATE customers SET city='Codeshire' WHERE customerID=7;
Nyní si zobrazíme aktualizovanou tabulku:
SELECT * FROM customers;
Vidíme, že hodnota v poli `city` u záznamu Danielle Ford (s `customerID=7`) byla upravena.
Aktualizace více polí
V předchozím příkladu jsme měnili pouze jedno pole. Stejným způsobem ale můžeme modifikovat i více polí současně:
Aktualizujeme `city` a `email` pro záznam s `customerID=1`:
UPDATE customers SET city='East Carlisle',email="[email protected]" WHERE customerID=1;
Následně opět zobrazíme všechny záznamy:
SELECT * FROM customers;
Výsledek:
Aktualizace více záznamů
Protože jsme použili `customerID`, což je primární klíč, předchozí dotazy měnily pouze jeden záznam. Pokud ale podmínka příkazu `UPDATE` platí pro více záznamů, budou upraveny všechny odpovídající.
Podívejme se na následující dotaz:
UPDATE customers SET discount=10 WHERE num_orders > 170;
Po spuštění si zobrazíme aktualizované záznamy:
SELECT * FROM customers;
Výstup:
Výsledkem tohoto dotazu je aktualizace tří záznamů, které mají `num_orders` větší než 170 a nyní mají hodnotu `discount` rovnou 10.
Aktualizace záznamů na základě více podmínek
Zatím měla klauzule `WHERE` jen jednu podmínku. V praxi se ale často setkáte s potřebou filtrovat záznamy podle více kritérií spojených logickými operátory.
Představme si situaci, kdy chceme nastavit slevu na 5 u zákazníků, kteří splňují dvě podmínky:
- `city LIKE ‚Nové %’`: Vybereme ty záznamy, kde pole `city` začíná slovem „Nové“.
- `num_orders > 100`: Vybereme jen ty záznamy, které mají v `num_orders` více než 100.
Příkaz UPDATE bude vypadat takto:
UPDATE customers SET DISCOUNT=5 WHERE city LIKE 'New%' AND num_orders>100;
Klauzule `WHERE` nyní obsahuje dvě podmínky spojené logickým operátorem `AND`. Upraveny budou jen ty záznamy, které splní obě podmínky současně.
Zobrazíme si výstup:
SELECT * FROM customers;
Vidíme, že pole `discount` bylo upraveno jen u těch záznamů, které splnily obě podmínky:
Časté upozornění při použití příkazu SQL UPDATE
Všechny doposud použité příkazy `UPDATE` obsahovaly klauzuli `WHERE`.
Představte si, že chcete například nastavit slevu na 25 pro specifického zákazníka, ale omylem zapomenete uvést `WHERE` s `customerID`:
UPDATE customers SET DISCOUNT=25;
Zobrazíme si tabulku:
SELECT * FROM customers;
Vidíme, že byly aktualizovány *všechny* záznamy v tabulce, což pravděpodobně nebylo zamýšlené chování.
⚠ Proto, pokud chcete aktualizovat jen podmnožinu záznamů, *nikdy* nezapomeňte přidat klauzuli `WHERE`. Pokud naopak chcete aktualizovat *všechny* záznamy v tabulce, klauzuli `WHERE` vynechejte.
V případě, že máte akci „Černý pátek“ a chcete nabídnout slevu 25% všem zákazníkům, vynechání klauzule `WHERE` dává smysl.
Závěr
Shrnutí toho, co jste se naučili:
- Příkaz `SQL UPDATE` slouží k aktualizaci dat v databázové tabulce.
- Příkaz `UPDATE` obvykle obsahuje klauzuli `WHERE`, která specifikuje, které záznamy se mají aktualizovat.
- Vyřazením klauzule `WHERE` aktualizujete *všechny* záznamy v tabulce. Proto je potřeba být opatrný a ujistit se, že to je vaše zamýšlené chování.
Podívejte se na tento SQL cheat sheet pro rychlé referenční informace.