SQLite INSERT, UPDATE, DELETE Upit s primjerom
Klauzule o izmjeni podataka u SQLite su naredbe INSERT, UPDATE i DELETE. Koristi se za umetanje novih redaka, ažuriranje postojećih vrijednosti ili brisanje redaka iz baze podataka.
Imajte na umu da za sve sljedeće primjere morate pokrenuti sqlite3.exe i otvoriti vezu s oglednom bazom podataka kao protočnu:
Korak 1) U ovom koraku
- Otvorite Moje računalo i dođite do sljedećeg direktorija "C:\sqlite"I
- Zatim otvorite "sqlite3.exe"
Korak 2) Otvori bazu podataka “TutorialsSampleDB.db” sljedećom naredbom:
.open TutorialsSampleDB.db
Sada ste spremni pokrenuti bilo koju vrstu upita u bazi podataka.
SQLite INSERT
SQLite INSERT se koristi za umetanje zapisa u određenu tablicu baze podataka. morate koristiti klauzulu 'INSERT'. Sintaksa klauzule INSERT je sljedeća:
- Nakon klauzule INSERT, trebate navesti u koju tablicu trebate unijeti vrijednosti.
- Nakon naziva tablice upisujete popis stupaca u koje želite umetnuti vrijednosti.
- Možete zanemariti nazive stupaca i ne pisati u njih.
- Ako ne napišete naziv stupaca, vrijednosti će biti umetnute u sve stupce koji se nalaze u tablici istim redoslijedom, stupci su definirani u tablici.
- Nakon klauzule VALUES, trebate navesti vrijednosti koje treba umetnuti.
- Svaka INSERT klauzula umeće samo jedan red. Ako želite umetnuti više redaka, trebali biste napisati više klauzula INSERT, po jednu za svaki red.
SQLite Primjer umetanja
U sljedećem primjeru umetnut ćemo 2 reda u tablicu učenika, po jedan za svakog učenika:
INSERT INTO Students(StudentId, StudentName, DepartmentId, DateOfBirth) VALUES(11, 'Ahmad', 4, '1997-10-12'); INSERT INTO Students VALUES(12, 'Aly', 4, '1996-10-12');
Ovo bi se trebalo uspješno izvoditi i za ovo nema izlaza:
Ovo će umetnuti dva učenika:
- Prvi student s StudentId=11, StudentName = Ahmad, DepartmentId = 4 i DateOfBirth = 1997-10-12.
- Drugi student s StudentId=12, StudentName = Aly, DepartmentId = 4 i DateOfBirth = 1996-10-12′.
U prvoj izjavi naveli smo nazive stupaca "StudentId, StudentName, DepartmentId, DateOfBirth“.Međutim, u drugoj izjavi nismo.
Četiri vrijednosti"12, 'Aly', 4, '1996-10-12'” bit će umetnuta u sva četiri stupca tablice Studenti istim redoslijedom kojim su stupci definirani.
Sada provjerimo jesu li dva učenika umetnuta u tablicu Studenti izvođenjem sljedećeg pitanje:
SELECT * FROM Students;
Tada biste trebali vidjeti dva učenika vraćena iz tog upita na sljedeći način:
SQLite Nadopune
SQLite UPDATE Query se koristi za izmjenu postojećih zapisa u tablici. Možete koristiti WHERE klauzulu s upitom UPDATE za ažuriranje odabranih redaka. Klauzula UPDATE ažurira tablicu promjenom vrijednosti za određeni stupac. Sljedeća je sintaksa klauzule UPDATE:
Kao što slijedi:
- Nakon "klauzule ažuriranja", trebali biste napisati naziv tablice za ažuriranje.
- Morate napisati "Klauzulu SET" koja se koristi za pisanje naziva stupca za ažuriranje i vrijednosti koja se ažurira.
- Možete ažurirati više od jednog stupca. Možete koristiti zarez između svakog retka.
- Možete navesti WHERE klauzulu da navedete samo neke retke. Ažuriraju se samo oni redovi za koje izraz procijeni da su istiniti. Ako niste naveli klauzulu WHERE, svi retci će se ažurirati.
SQLite Primjer ažuriranja
U sljedećoj izjavi UPDATE ažurirat ćemo DepartmentId za studenta s StudentId = 6 na 3:
UPDATE Students SET DepartmentId = 3 WHERE StudentId = 6;
Ovo bi se trebalo uspješno izvoditi i ne biste trebali dobiti nikakav izlaz:
U klauzuli UPDATE naveli smo da želimo ažurirati tablicu Studenti.
- U klauzuli WHERE filtrirali smo sve studente kako bismo odabrali samo redak za StudentId = 6.
- Klauzula SET ažurirat će vrijednost ID-a odjela za odabrane studente na 3.
Provjerimo sada je li učenik s ID-om 6 ažuriran izvođenjem sljedeće naredbe:
SELECT * FROM Students WHERE StudentId = 6;
Sada biste trebali vidjeti da je vrijednost Id odjela sada 3 kako slijedi:
SQLite Izbrisati
SQLite Upit DELETE koristi se za uklanjanje postojećih zapisa iz navedene tablice. Možete koristiti klauzulu WHERE s upitima DELETE za brisanje odabranih redaka.
Klauzula DELETE ima sljedeću sintaksu:
- Nakon klauzule DELETE FROM morate napisati naziv tablice iz koje želite izbrisati zapise. (Bilješka: da je DELETE klauzula koristi se za brisanje nekih zapisa iz tablice ili brisanje svih zapisa, a neće izbrisati samu tablicu. Međutim DROP klauzula koristi se za brisanje cijele tablice sa svim zapisima u njoj.)
- Ako klauzulu DELETE napišete ovako "DELETE FROM guru", to će izbrisati sve zapise iz tablice "guru".
- Možete navesti WHERE uvjet s izrazom ako želite izbrisati neke određene retke. Izbrisat će se samo oni redovi za koje je vrijednost izraza istinita. Na primjer, “DELETE FROM guru WHERE id > 5” – ovo će izbrisati samo zapise koji imaju id veći od 5.
Primjer
U sljedećoj izjavi izbrisat ćemo dva studenta s StudentId 11 i 12:
DELETE FROM Students WHERE StudentId = 11 OR StudentId = 12;
Izraz "StudentId = 11 ILI StudentId = 12” vrijedit će samo za studente s ID-ovima 11 i 12. Dakle, klauzula DELETE će se primijeniti na oba i izbrisat će samo njih.
Ova bi se naredba trebala uspješno izvoditi i ne biste trebali dobiti nikakav izlaz kao što je navedeno:
Možete provjeriti jesu li dva učenika izbrisana odabirom svih zapisa iz tablice Studenti na sljedeći način:
SELECT * FROM Students;
Ne biste trebali vidjeti dva učenika s ID-ovima 11 i 12 kako slijedi:
SQLite Klauzula o sukobu
Pretpostavimo da imate stupac koji ima jedno od sljedećih ograničenja stupca: UNIQUE, NOT NULL, CHECK ili PRIMARY KEY. A onda ste pokušali umetnuti ili ažurirati vrijednost u tom stupcu s vrijednošću koja je u sukobu s ovim ograničenjem.
Na primjer, ako stupac ima UNIQUE ograničenje, a vi ste pokušali umetnuti vrijednost koja već postoji (duplicirana vrijednost), što je u sukobu s UNIQUE ograničenjem. Tada vam klauzula CONFLICT omogućuje da odaberete što učiniti u takvim slučajevima da riješite ovaj sukob.
Prije nego nastavimo objašnjavati kako klauzula CONFLICT rješava sukob. Trebali biste razumjeti što je transakcija baze podataka.
Transakcija baze podataka
Izraz transakcija baze podataka je popis SQLite operacije (umetanje, ažuriranje ili brisanje). Transakcija baze podataka mora se izvršiti kao jedna cjelina, bilo da se sve operacije izvrše uspješno ili da se uopće ne izvrše. Sve će operacije biti otkazane ako se jedna od njih ne izvrši.
Primjer za transakciju baze podataka
Transakcija prijenosa novca s jednog bankovnog računa na drugi uključuje nekoliko aktivnosti. Ova transakcijska operacija uključuje podizanje novca s prvog računa i polaganje na drugi račun. Ova transakcija mora biti u potpunosti dovršena ili u potpunosti otkazana i ne smije uspjeti na pola puta.
Evo popisa od pet rješenja koja možete odabrati u klauzuli CONFLICT:
- VRAĆANJE – ovo će vratiti transakciju u kojoj je trenutni SQLite izjava koja ima sukob (otkazat će cijelu transakciju). Na primjer, ako pokušavate ažurirati 10 redaka, a peti redak ima vrijednost koja je u sukobu s ograničenjem, tada se nijedan redak neće ažurirati, 10 redaka ostat će isti. Prikazat će se pogreška.
- PREKID – ovo će prekinuti (poništiti) struju SQLite samo izjava koja ima sukob i transakcija neće biti otkazana. Na primjer, ako pokušavate ažurirati 10 redaka, a peti redak ima vrijednost koja je u sukobu s ograničenjem, tada samo peta vrijednost neće biti ažurirana, ali će se ažurirati ostalih 9 redaka. Prikazat će se pogreška.
- IZNEVJERITI - prekida struju SQLite izjava koja ima sukob. Međutim, transakcija se neće nastaviti, ali će se primijeniti prethodne promjene u redovima prije retka koji ima sukob. Na primjer, ako pokušavate ažurirati 10 redaka, a peti red ima vrijednost koja je u sukobu s ograničenjem, tada će se ažurirati samo 4 reda, a drugi neće. Prikazat će se pogreška.
- ZANEMARITI – ovo će preskočiti redak koji sadrži kršenje ograničenja i nastaviti s obradom ostalih sljedećih redaka SQLite izjava. Na primjer, ako pokušavate ažurirati 10 redaka, a peti red ima vrijednost koja je u sukobu s ograničenjem, tada će se ažurirati samo 4 reda, a drugi neće. Neće nastaviti s ažuriranjem drugih redaka i zaustaviti se na retku koji ima vrijednost sukoba. Neće se pojaviti pogreška.
- ZAMJENA – ovisi o vrsti ograničenja koje ima kršenje:
- Kada postoji kršenje ograničenja za ograničenje UNIQUE ili PRIMARY KEY. ZAMJENA će zamijeniti redak koji uzrokuje kršenje novim umetnutim ili ažuriranim redom.
- Kada postoji kršenje NOT NULL ograničenja, REPLACE klauzula će zamijeniti NULL vrijednost zadanom vrijednošću tog stupca. Ako stupac nema zadanu vrijednost, onda SQLite će prekinuti izjavu (izjava će biti otkazana)
- AKO dođe do kršenja ograničenja CHECK, klauzula će biti prekinuta.
Bilješka: Gornjih 5 rješenja su opcije za način na koji želite riješiti sukob. Možda nije nužno ono što je primjenjivo za rješavanje jednog sukoba primjenjivo i za rješavanje drugih vrsta sukoba.
Kako deklarirati klauzulu CONFLICT
Možete deklarirati klauzulu ON CONFLICT kada definirate ograničenje za definiciju stupca unutar klauzule CREATE TABLE. Koristeći sljedeću sintaksu:
Možete odabrati jedno od pet rješenja za rješavanje sukoba kao što je prethodno objašnjeno.
O ZANEMARIVANJU SUKOBA Primjer
Korak 1) Napravite novi predmet tablice na sljedeći način:
CREATE TABLE [Subjects] ( [SubjectId] INTEGER NOT NULL PRIMARY KEY ON CONFLICT IGNORE, [SubjectName] NVARCHAR NOT NULL );
Primijetite da smo definirali ograničenje PRIMARY KEY na stupcu SubjectId. Ograničenje primarnog ključa neće dopustiti da se dvije duplicirane vrijednosti umetnu u stupac SubjectId tako da sve vrijednosti u tom stupcu trebaju biti jedinstvene. Također, primijetite da odabiremo rješenje sukoba kao "ZANEMARITI".
Naredba bi se trebala uspješno izvoditi i ne biste trebali dobiti nikakve pogreške:
Korak 2) Umetnimo sada neke vrijednosti u nove subjekte tablice, ali s vrijednošću koja krši ograničenje primarnog ključa:
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');
U ovu izjavu INSERT pokušali smo umetnuti dva tečaja s istim ID-om subjekta primarnog ključa 2, što predstavlja kršenje ograničenja primarnog ključa.
Naredbe bi se trebale dobro izvoditi i ne biste trebali dobivati nikakve pogreške. Kao što slijedi:
Korak 3) Odaberite sve predmete iz tablice na sljedeći način:
SELECT * FROM Subjects;
Ovo će vam dati popis predmeta:
Primijetite da su umetnuta samo tri subjekta "Algebra, tečaj baze podataka i Algorithms” umjesto 4 reda.
Redak koji ima vrijednost koja krši ograničenje primarnog ključa, a to je "Strukture podataka", zanemaren je i nije umetnut. Međutim, SQLite nastavlja izvršavanje drugih naredbi nakon tog reda.
Korak 4) IZBRIŠITE subjekte tablice da biste je ponovno stvorili s drugom klauzulom ON CONFLICT za sljedeći primjer izvođenjem sljedeće naredbe:
DROP TABLE Subjects;
Naredba drop briše cijelu tablicu. Tablica Subjects sada ne postoji.
O SUKOBU ZAMIJENI Primjer
Korak 1) Napravite novi predmet tablice na sljedeći način:
CREATE TABLE [Subjects] ( [SubjectId] INTEGER NOT NULL PRIMARY KEY ON CONFLICT REPLACE, [SubjectName] NVARCHAR NOT NULL );
Primijetite da smo definirali ograničenje PRIMARY KEY na stupcu SubjectId. Ograničenje primarnog ključa neće dopustiti da se dvije duplicirane vrijednosti umetnu u stupac SubjectId tako da sve vrijednosti u tom stupcu trebaju biti jedinstvene.
Također, primijetite da odabiremo opciju rješavanja sukoba kao "ZAMJENA“. Naredba bi se trebala uspješno izvoditi i ne biste trebali dobiti nikakve pogreške:
Korak 2) Umetnimo sada neke vrijednosti u novu tablicu Predmeti, ali s vrijednošću koja krši ograničenje primarnog ključa:
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');
U ovu izjavu INSERT pokušali smo umetnuti dva tečaja s istim ID-om subjekta primarnog ključa 2, što predstavlja kršenje ograničenja primarnog ključa.
Naredbe bi se trebale dobro izvoditi i ne biste trebali dobivati nikakve pogreške. Kao što slijedi:
Korak 3) Odaberite sve predmete iz tablice na sljedeći način:
SELECT * FROM Subjects;
Ovo će vam dati popis predmeta:
Primijetite da su umetnuta samo tri subjekta "Algebra, strukture podataka i Algorithms” dok smo mi pokušali umetnuti 4 retka.
Redak koji ima vrijednost koja krši ograničenje primarnog ključa, a to je "Strukture podataka” zamijenio vrijednost “Tečaj baze podataka” kako slijedi:
- Prve dvije izjave za umetanje rade dobro bez problema. Dva predmeta Algebra i Tečaj baze podataka bit će umetnuti s ID-ovima 1, 2.
- Kada SQLite pokušava pokrenuti treću naredbu umetanja s SubjectId 2 i SubjectName “Strukture podataka“, otkriva da već postoji predmet s SubjectId = 2. Što je kršenje ograničenja primarnog ključa definiranog u stupcu SubjectId.
- SQLite izabrat će ZAMIJENI rješenje za ovaj sukob. Zamjenjuje vrijednost koja već postoji u tablici predmeta s novom vrijednošću iz izjave za umetanje. Dakle, "Tečaj baze podataka” SubjectName bit će zamijenjen s “Strukture podataka” Naziv subjekta.
Rezime
Klauzule INSERT, UPDATE i DELETE koriste se za izmjenu podataka u SQLite baza podataka. Klauzula CONFLICT moćna je klauzula za rješavanje bilo kakvog sukoba između podataka i podataka za izmjenu.