SQLite INSERT, UPDATE, DELETE Dotaz s příkladem
Ustanovení o úpravě dat v SQLite jsou příkazy INSERT, UPDATE a DELETE. Slouží pro vkládání nových řádků, aktualizaci stávajících hodnot nebo mazání řádků z databáze.
Všimněte si, že pro všechny následující příklady musíte spustit sqlite3.exe a otevřít připojení k ukázkové databázi jako plynulé:
Krok 1) V tomto kroku,
- Otevřete Tento počítač a přejděte do následujícího adresáře “C:\sqlite" a
- Poté otevřete „sqlite3.exe"
Krok 2) Otevřít databázi"NávodySampleDB.db“ pomocí následujícího příkazu:
.open TutorialsSampleDB.db
Nyní jste připraveni spustit jakýkoli typ dotazu na databázi.
SQLite INSERT
SQLite INSERT slouží k vložení záznamů do zadané tabulky databáze. musíte použít klauzuli 'INSERT'. Syntaxe klauzule INSERT je následující:
- Po klauzuli INSERT byste měli uvést, do které tabulky potřebujete vložit hodnoty.
- Za názvem tabulky napíšete seznam sloupců, do kterých chcete vložit hodnoty.
- Název sloupců můžete ignorovat a nepsat do nich.
- Pokud nenapíšete název sloupce, budou hodnoty vloženy do všech nalezených sloupců v tabulce se stejným pořadím, sloupce jsou definovány v tabulce.
- Po klauzuli VALUES byste měli uvést hodnoty, které mají být vloženy.
- Každá klauzule INSERT vloží pouze jeden řádek. Pokud chcete vložit více řádků, měli byste napsat více klauzulí INSERT, jednu pro každý řádek.
SQLite Vložit příklad
V následujícím příkladu vložíme do tabulky studentů 2 řádky, jeden pro každého studenta:
INSERT INTO Students(StudentId, StudentName, DepartmentId, DateOfBirth) VALUES(11, 'Ahmad', 4, '1997-10-12'); INSERT INTO Students VALUES(12, 'Aly', 4, '1996-10-12');
To by mělo běžet úspěšně a neexistuje pro to žádný výstup:
Tím se vloží dva studenti:
- První student s StudentId=11, StudentName = Ahmad, DepartmentId = 4 a DateOfBirth = 1997-10-12.
- Druhý student s StudentId=12, StudentName = Aly, DepartmentId = 4 a DateOfBirth = 1996-10-12′.
V prvním příkazu jsme uvedli názvy sloupců „StudentId, StudentName, DepartmentId, DateOfBirth"V druhém prohlášení jsme to neudělali."
Čtyři hodnoty"12, 'Aly', 4, '1996-10-12'“ se vloží do všech čtyř sloupců tabulky Studenti ve stejném pořadí, v jakém jsou definovány sloupce.
Nyní ověřte, že dva studenti byli vloženi do tabulky Studenti spuštěním následujícího dotaz:
SELECT * FROM Students;
Pak byste měli vidět dva studenty vrácené z tohoto dotazu takto:
SQLite Aktualizace
SQLite UPDATE Query se používá k úpravě existujících záznamů v tabulce. K aktualizaci vybraných řádků můžete použít klauzuli WHERE s dotazem UPDATE. Klauzule UPDATE aktualizuje tabulku změnou hodnoty pro určitý sloupec. Následuje syntaxe klauzule UPDATE:
Takto:
- Za „klauzuli aktualizace“ byste měli napsat název tabulky, kterou chcete aktualizovat.
- Musíte napsat „klauzuli SET“, která se používá k zápisu názvu sloupce, který se má aktualizovat, a hodnoty, která se má aktualizovat.
- Můžete aktualizovat více než jeden sloupec. Mezi jednotlivými řádky můžete použít čárku.
- Můžete zadat klauzuli WHERE a zadat pouze některé řádky. Aktualizují se pouze řádky, které výraz vyhodnotí jako true. Pokud jste nezadali klauzuli WHERE, budou aktualizovány všechny řádky.
SQLite Příklad aktualizace
V následujícím příkazu UPDATE aktualizujeme DepartmentId pro studenta s StudentId = 6 na hodnotu 3:
UPDATE Students SET DepartmentId = 3 WHERE StudentId = 6;
To by mělo běžet úspěšně a neměli byste získat žádný výstup:
V klauzuli UPDATE jsme zadali, že chceme aktualizovat tabulku Studenti.
- V klauzuli WHERE jsme filtrovali všechny studenty, abychom vybrali pouze řádek pro StudentId = 6.
- Klauzule SET aktualizuje hodnotu ID oddělení pro vybrané studenty na 3.
Nyní ověřte, že je student s ID 6 aktualizován spuštěním následujícího příkazu:
SELECT * FROM Students WHERE StudentId = 6;
Nyní byste měli vidět, že hodnota ID oddělení je nyní 3 takto:
SQLite Vymazat
SQLite Dotaz DELETE se používá k odstranění existujících záznamů ze zadané tabulky. K odstranění vybraných řádků můžete použít klauzuli WHERE s dotazy DELETE.
Klauzule DELETE má následující syntaxi:
- Za klauzuli DELETE FROM musíte napsat název tabulky, ze které chcete odstranit záznamy. (Poznámka: že klauzule DELETE se používá k odstranění některých záznamů z tabulky nebo odstranění všech záznamů a nesmaže samotnou tabulku. Nicméně, doložka DROP se používá k odstranění celé tabulky se všemi záznamy v ní.)
- Pokud napíšete klauzuli DELETE takto „DELETE FROM guru“, odstraní se tím všechny záznamy z tabulky „guru“.
- Pokud chcete odstranit některé konkrétní řádky, můžete pomocí výrazu zadat podmínku WHERE. Budou odstraněny pouze řádky, pro které je výraz vyhodnocen jako true. Například „DELETE FROM guru WHERE id > 5“ – toto smaže pouze záznamy, které mají id větší než 5.
Příklad
V následujícím prohlášení odstraníme dva studenty se StudentId 11 a 12:
DELETE FROM Students WHERE StudentId = 11 OR StudentId = 12;
Výraz "StudentId = 11 NEBO StudentId = 12” bude platit pouze pro studenty s ID 11 a 12. Klauzule DELETE se tedy použije na oba a smaže pouze je.
Tento příkaz by měl běžet úspěšně a neměli byste získat žádný výstup jako následující:
Můžete ověřit, že tito dva studenti byli smazáni, výběrem všech záznamů z tabulky Studenti následovně:
SELECT * FROM Students;
Neměli byste vidět dva studenty s ID 11 a 12 takto:
SQLite Konfliktní klauzule
Předpokládejme, že máte sloupec, který má jedno z následujících omezení sloupců: UNIQUE, NOT NULL, CHECK nebo PRIMARY KEY. A pak jste se pokusili vložit nebo aktualizovat hodnotu do tohoto sloupce s hodnotou, která je v konfliktu s tímto omezením.
Pokud má například sloupec podmínku UNIQUE a pokusili jste se vložit hodnotu, která již existuje (duplicitní hodnota), což je v konfliktu s podmínkou UNIQUE. Pak vám klauzule CONFLICT umožní vybrat si, co dělat v takových případech, abyste tento konflikt vyřešili.
Než budeme pokračovat ve vysvětlování toho, jak klauzule CONFLICT řeší konflikt. Měli byste pochopit, co je databázová transakce.
Databázová transakce
Termín databázová transakce je seznam SQLite operace (vložení nebo aktualizace nebo odstranění). Databázová transakce musí být provedena jako jedna jednotka, buď všechny operace byly provedeny úspěšně, nebo nebyly provedeny vůbec. Pokud se některá z nich nepodaří provést, budou všechny operace zrušeny.
Příklad databázové transakce
Transakce pro převod peněz z jednoho bankovního účtu na druhý bude zahrnovat několik činností. Tato transakční operace zahrnuje výběr peněz z prvního účtu a jejich vložení na jiný účet. Tato transakce musí být zcela dokončena nebo zcela zrušena a nesmí selhat v polovině.
Zde je seznam pěti řešení, která si můžete vybrat v klauzuli CONFLICT:
- NÁVRAT – tím se vrátí zpět transakce, ve které je aktuální SQLite výpis, který má konflikt (zruší celou transakci). Pokud se například pokoušíte aktualizovat 10 řádků a pátý řádek má hodnotu, která je v konfliktu s omezením, nebudou aktualizovány žádné řádky, 10 řádků zůstane stejných. Bude vyvolána chyba.
- POTRAT – tím se přeruší (zruší) proud SQLite pouze výpis, který má konflikt a transakce nebude zrušena. Pokud se například pokoušíte aktualizovat 10 řádků a pátý řádek má hodnotu, která je v konfliktu s omezením, nebude aktualizována pouze pátá hodnota, ale bude aktualizováno dalších 9 řádků. Bude vyvolána chyba.
- FAIL – přeruší proud SQLite prohlášení, které má konflikt. Transakce však nebude pokračovat, ale budou potvrzeny předchozí změny provedené v řádcích před řádkem, který má konflikt. Pokud se například pokoušíte aktualizovat 10 řádků a pátý řádek má hodnotu, která je v rozporu s omezením, budou aktualizovány pouze 4 řádky a druhý nikoli. Bude vyvolána chyba.
- IGNOROVAT – tím přeskočíte řádek obsahující porušení omezení a budete pokračovat ve zpracování dalších následujících řádků SQLite prohlášení. Pokud se například pokoušíte aktualizovat 10 řádků a pátý řádek má hodnotu, která je v rozporu s omezením, budou aktualizovány pouze 4 řádky a druhý nikoli. Nebude pokračovat v aktualizaci dalších řádků a zastaví se na řádku, který má konfliktní hodnotu. Nebude vyvolána žádná chyba.
- VÝMĚNA – záleží na typu omezení, které má porušení:
- Když dojde k porušení omezení pro omezení UNIQUE nebo PRIMARY KEY. REPLACE nahradí řádek, který způsobuje porušení, novým vloženým nebo aktualizovaným řádkem.
- Pokud dojde k porušení podmínky NOT NULL, klauzule REPLACE nahradí hodnotu NULL výchozí hodnotou daného sloupce. Pokud sloupec nemá výchozí hodnotu, pak SQLite zruší výpis (výpis bude zrušen)
- POKUD dojde k porušení podmínky CHECK, klauzule bude zrušena.
Poznámka: Výše uvedených 5 řešení představuje možnosti, jak chcete konflikt vyřešit. Nemusí být nutně to, co platí pro vyřešení jednoho konfliktu, platí pro řešení jiných typů konfliktů.
Jak deklarovat klauzuli CONFLICT
Klauzuli ON CONFLICT můžete deklarovat, když definujete omezení pro definici sloupce v klauzuli CREATE TABLE. Pomocí následující syntaxe:
Můžete si vybrat jedno z pěti řešení k vyřešení konfliktu, jak bylo vysvětleno výše.
ON CONFLICT IGNORE Příklad
Krok 1) Vytvořte nový předmět tabulky následovně:
CREATE TABLE [Subjects] ( [SubjectId] INTEGER NOT NULL PRIMARY KEY ON CONFLICT IGNORE, [SubjectName] NVARCHAR NOT NULL );
Všimněte si, že jsme definovali omezení PRIMARY KEY ve sloupci SubjectId. Omezení primárního klíče nedovolí vložit dvě duplicitní hodnoty do sloupce SubjectId, takže všechny hodnoty v tomto sloupci by měly být jedinečné. Všimněte si také, že řešení konfliktu volíme jako „IGNOROVAT".
Příkaz by měl proběhnout úspěšně a neměli byste dostat žádné chyby:
Krok 2) Nyní vložíme některé hodnoty do nových předmětů tabulky, ale s hodnotou, která porušuje omezení primárního klíče:
INSERT INTO Subjects VALUES(1, 'Algebra'); INSERT INTO Subjects VALUES(2, 'Database Course'); INSERT INTO Subjects VALUES(2, 'Data Structures'); INSERT INTO Subjects VALUES(4, 'Algorithms');
Do tohoto příkazu INSERT jsme se pokusili vložit dva kurzy se stejným ID předmětu primárního klíče 2, což je porušení omezení primárního klíče.
Příkazy by měly fungovat dobře a neměli byste dostat žádné chyby. Takto:
Krok 3) Vyberte všechny předměty z tabulky následovně:
SELECT * FROM Subjects;
Tím získáte seznam předmětů:
Všimněte si, že byly vloženy pouze tři předměty „Algebra, kurz databáze a Algorithms“ místo 4 řádků.
Řádek s hodnotou, která porušuje omezení primárního klíče, což je „Datové struktury“, byl ignorován a nebyl vložen. Nicméně, SQLite pokračuje ve vykonávání dalších příkazů po tomto řádku.
Krok 4) DELETE předměty tabulky a vytvořte ji znovu s jinou klauzulí ON CONFLICT pro následující příklad spuštěním následujícího příkazu:
DROP TABLE Subjects;
Příkaz drop odstraní celou tabulku. Předměty tabulky nyní neexistují.
ON CONFLICT REPLACE Příklad
Krok 1) Vytvořte nový předmět tabulky následovně:
CREATE TABLE [Subjects] ( [SubjectId] INTEGER NOT NULL PRIMARY KEY ON CONFLICT REPLACE, [SubjectName] NVARCHAR NOT NULL );
Všimněte si, že jsme definovali omezení PRIMARY KEY ve sloupci SubjectId. Omezení primárního klíče nedovolí vložit dvě duplicitní hodnoty do sloupce SubjectId, takže všechny hodnoty v tomto sloupci by měly být jedinečné.
Všimněte si také, že volíme možnost řešení konfliktů jako „VÝMĚNA“. Příkaz by měl proběhnout úspěšně a neměli byste dostat žádné chyby:
Krok 2) Nyní vložíme některé hodnoty do nové tabulky Předměty, ale s hodnotou, která porušuje omezení primárního klíče:
INSERT INTO Subjects VALUES(1, 'Algebra'); INSERT INTO Subjects VALUES(2, 'Database Course'); INSERT INTO Subjects VALUES(2, 'Data Structures'); INSERT INTO Subjects VALUES(4, 'Algorithms');
Do tohoto příkazu INSERT jsme se pokusili vložit dva kurzy se stejným ID předmětu primárního klíče 2, což je porušení omezení primárního klíče.
Příkazy by měly fungovat dobře a neměli byste dostat žádné chyby. Takto:
Krok 3) Vyberte všechny předměty z tabulky následovně:
SELECT * FROM Subjects;
Tím získáte seznam předmětů:
Všimněte si, že byly vloženy pouze tři předměty „Algebra, datové struktury a Algorithms“ zatímco jsme se pokusili vložit 4 řádky.
Řádek, který má hodnotu, která porušuje omezení primárního klíče, což je „Datové struktury“ nahradil hodnotu “Kurz databáze“ takto:
- První dva příkazy vložení fungují bez problémů. Budou vloženy dva předměty Algebra a Kurz databáze s ID 1, 2.
- Kdy SQLite se pokusí spustit třetí příkaz insert s SubjectId 2 a SubjectName “Datové struktury“, zjistí, že již existuje subjekt s SubjectId = 2. Což je porušení omezení primárního klíče definovaného ve sloupci SubjectId.
- SQLite vybere pro tento konflikt řešení REPLACE. Nahradí hodnotu, která již existuje v tabulce předmětů, novou hodnotou z příkazu insert. Takže "Kurz databáze„Název předmětu bude nahrazen výrazem „Datové struktury“Název předmětu.
Shrnutí
Klauzule INSERT, UPDATE a DELETE se používají k úpravě dat v souboru SQLite databáze. Klauzule CONFLICT je mocná klauzule pro vyřešení jakéhokoli konfliktu mezi daty a daty, která je třeba upravit.