SQLite INSERT, UPDATE, DELETE Interogare cu exemplu
โก Rezumat inteligent
SQLite Instrucศiunile INSERT, UPDATE ศi DELETE modificฤ datele dintr-o bazฤ de date prin adฤugarea de noi rรขnduri, modificarea valorilor existente ศi eliminarea รฎnregistrฤrilor, รฎn timp ce clauza ON CONFLICT decide modul รฎn care sunt rezolvate รฎncฤlcฤrile constrรขngerilor รฎn timpul acestor operaศiuni.

Inserare, actualizare ศi ศtergere interogare รฎn SQLite
Clauzele de modificare a datelor รฎn SQLite sunt instrucศiunile INSERT, UPDATE ศi DELETE. Este folosit pentru inserarea de noi rรขnduri, actualizarea valorilor existente sau ศtergerea rรขndurilor din baza de date.
Reศineศi cฤ, pentru toate exemplele urmฤtoare, trebuie sฤ rulaศi sqlite3.exe ศi sฤ deschideศi o conexiune la baza de date eศantion ca flux:
Pas 1) รn aceastฤ etapฤ,
- Deschideศi My Computer ศi navigaศi la urmฤtorul director โC:\sqliteโ ศi
- Apoi deschideศi โsqlite3.exeโ:
Pas 2) Deschideศi baza de date โTutorialsSampleDB.dbโ cu urmฤtoarea comandฤ:
.open TutorialsSampleDB.db
Acum sunteศi gata sฤ rulaศi orice tip de interogare รฎn baza de date.
SQLite INSERT
SQLite INSERT este folosit pentru a insera รฎnregistrฤri รฎntr-un tabel specificat al bazei de date. trebuie sฤ utilizaศi clauza โINSERTโ. Sintaxa clauzei INSERT este urmฤtoarea:
- Dupฤ clauza INSERT, ar trebui sฤ precizaศi รฎn ce tabel trebuie sฤ introduceศi valorile.
- Dupฤ numele tabelului scrieศi lista de coloane, doriศi sฤ introduceศi valorile รฎn care.
- Puteศi ignora numele coloanelor ศi nu le scrieศi.
- Dacฤ nu scrieศi numele coloanelor, valorile vor fi inserate รฎn toate coloanele gฤsite รฎn tabel รฎn aceeaศi ordine, coloanele sunt definite รฎn tabel.
- Dupฤ clauza VALUES, ar trebui sฤ enumeraศi valorile care trebuie inserate.
- Fiecare clauzฤ INSERT insereazฤ doar un rรขnd. Dacฤ doriศi sฤ inseraศi mai multe rรขnduri, ar trebui sฤ scrieศi mai multe clauze INSERT, cรขte una pentru fiecare rรขnd.
SQLite Exemplu de inserare
รn exemplul urmฤtor, vom insera 2 rรขnduri รฎn tabelul studenศilor, cรขte unul pentru fiecare elev:
INSERT INTO Students(StudentId, StudentName, DepartmentId, DateOfBirth) VALUES(11, 'Ahmad', 4, '1997-10-12'); INSERT INTO Students VALUES(12, 'Aly', 4, '1996-10-12');
Aceasta ar trebui sฤ ruleze cu succes ศi nu existฤ nicio ieศire pentru aceasta:
Aceasta va introduce doi elevi:
- Primul elev cu StudentId=11, StudentName = Ahmad, DepartmentId = 4 ศi DateOfBirth = 1997-10-12.
- Al doilea student cu StudentId=12, StudentName = Aly, DepartmentId = 4 ศi DateOfBirth = 1996-10-12.
รn prima instrucศiune, am listat numele coloanelor โStudentId, StudentName, DepartmentId, DateOfBirthโ. Cu toate acestea, รฎn a doua instrucศiune, nu am fฤcut-o.
Cele patru valori โ12, 'Aly', 4, '1996-10-12'โ vor fi inserate รฎn toate cele patru coloane ale tabelului Studenศi รฎn aceeaศi ordine รฎn care sunt definite coloanele.
Acum, sฤ verificฤm dacฤ cei doi studenศi au fost inseraศi รฎn tabelul Studenศi, rulรขnd urmฤtoarele รฎntrebare:
SELECT * FROM Students;
Apoi ar trebui sฤ vedeศi cei doi studenศi reveniศi de la acea interogare dupฤ cum urmeazฤ:
SQLite Actualizeazฤ
SQLite UPDATE Query este folositฤ pentru a modifica รฎnregistrฤrile existente รฎntr-un tabel. Puteศi utiliza clauza WHERE cu interogarea UPDATE pentru a actualiza rรขndurile selectate. Clauza UPDATE actualizeazฤ un tabel prin modificarea unei valori pentru o anumitฤ coloanฤ. Urmฤtoarea este sintaxa clauzei UPDATE:
Dupฤ cum urmeazฤ:
- Dupฤ โclauza de actualizareโ, ar trebui sฤ scrieศi numele tabelului de actualizat.
- Trebuie sฤ scrieศi โclauza SETโ care este folositฤ pentru a scrie numele coloanei de actualizat ศi valoarea de actualizat.
- Puteศi actualiza mai multe coloane. Puteศi folosi o virgulฤ รฎntre fiecare rรขnd.
- Puteศi specifica o clauzฤ WHERE pentru a specifica doar unele rรขnduri. Sunt actualizate doar rรขndurile pe care expresia le evalueazฤ drept adevฤrat. Dacฤ nu aศi specificat o clauzฤ WHERE, toate rรขndurile vor fi actualizate.
SQLite Exemplu de actualizare
รn urmฤtoarea instrucศiune UPDATE, vom actualiza DepartmentId pentru Studentul cu StudentId = 6 pentru a fi 3:
UPDATE Students SET DepartmentId = 3 WHERE StudentId = 6;
Aceasta ar trebui sฤ ruleze cu succes ศi nu ar trebui sฤ obศineศi niciun rezultat:
รn clauza UPDATE am specificat cฤ dorim sฤ actualizฤm tabelul Studenศi.
- รn clauza WHERE, am filtrat toศi studenศii pentru a selecta doar rรขndul pentru StudentId = 6.
- Clauza SET va actualiza valoarea ID-ului departamentului pentru studenศii selectaศi sฤ fie 3.
Acum, sฤ verificฤm dacฤ studentul cu ID 6 este actualizat, rulรขnd urmฤtoarea comandฤ:
SELECT * FROM Students WHERE StudentId = 6;
Ar trebui sฤ vedeศi acum cฤ valoarea ID-ului departamentului este acum 3, dupฤ cum urmeazฤ:
SQLite ศterge
SQLite Interogarea DELETE este utilizatฤ pentru a elimina รฎnregistrฤrile existente dintr-un tabel specificat. Puteศi folosi clauza WHERE cu interogฤri DELETE pentru a ศterge rรขndurile selectate.
Clauza DELETE are urmฤtoarea sintaxฤ:
- Trebuie sฤ scrieศi un nume de tabel dupฤ clauza DELETE FROM, din care doriศi sฤ ศtergeศi รฎnregistrฤrile. (Notฤ: clauza DELETE este utilizatฤ pentru a ศterge unele รฎnregistrฤri dintr-un tabel sau pentru a ศterge toate รฎnregistrฤrile ศi nu va ศterge tabelul รฎn sine. Cu toate acestea, clauza DROP este utilizatฤ pentru a ศterge รฎntregul tabel cu toate รฎnregistrฤrile de pe acesta.)
- Dacฤ scrieศi clauza DELETE astfel โDELETE FROM guruโ, aceasta va ศterge toate รฎnregistrฤrile din tabelul โguruโ.
- Puteศi specifica o condiศie WHERE cu o expresie dacฤ doriศi sฤ ศtergeศi anumite rรขnduri. Doar rรขndurile pentru care expresia este evaluatฤ ca adevฤratฤ vor fi ศterse. De exemplu, โDELETE FROM guru WHERE id > 5โ โ aceasta va ศterge numai รฎnregistrฤrile care au id-ul mai mare de 5.
Exemplu
รn urmฤtoarea declaraศie, vom ศterge doi studenศi cu StudentId 11 ศi 12:
DELETE FROM Students WHERE StudentId = 11 OR StudentId = 12;
Expresia โStudentId = 11 OR StudentId = 12โ va fi adevฤratฤ doar pentru studenศii cu ID-urile 11 ศi 12. Deci, clauza DELETE se va aplica ambilor ศi รฎi va ศterge doar pe aceศtia.
Aceastฤ comandฤ ar trebui sฤ ruleze cu succes ศi nu ar trebui sฤ obศineศi niciun rezultat dupฤ cum urmeazฤ:
Puteศi verifica dacฤ cei doi studenศi au fost ศterศi, selectรขnd toate รฎnregistrฤrile din tabelul Studenศi dupฤ cum urmeazฤ:
SELECT * FROM Students;
Nu ar trebui sฤ vedeศi cei doi studenศi cu ID-urile 11 ศi 12 dupฤ cum urmeazฤ:
SQLite Clauza de conflict
Sฤ presupunem cฤ aveศi o coloanฤ care are una dintre urmฤtoarele constrรขngeri de coloanฤ: UNIQUE, NOT NULL, CHECK sau PRIMARY KEY. ศi apoi aศi รฎncercat sฤ inseraศi sau sฤ actualizaศi o valoare pe acea coloanฤ cu o valoare care intrฤ รฎn conflict cu aceastฤ constrรขngere.
De exemplu, dacฤ o coloanฤ are o constrรขngere UNIQUE ศi aศi รฎncercat sฤ inseraศi o valoare care existฤ deja (o valoare duplicatฤ), care intrฤ รฎn conflict cu constrรขngerea UNIQUE. Apoi, clauza CONFLICT vฤ permite sฤ alegeศi ce sฤ faceศi รฎn astfel de cazuri pentru a rezolva acest conflict.
รnainte de a continua explicarea modului รฎn care clauza CONFLICT rezolvฤ conflictul. Ar trebui sฤ รฎnศelegeศi ce este o tranzacศie de bazฤ de date.
Tranzacศie cu baze de date
Termenul tranzacศie baza de date este o listฤ de SQLite operaศiuni (inserare sau actualizare sau ศtergere). Tranzacศia bazei de date trebuie sฤ fie executatฤ ca o singurฤ unitate, fie toate operaศiunile executate cu succes, fie deloc. Toate operaศiunile vor fi anulate dacฤ una dintre ele nu a reuศit sฤ se execute.
Exemplu pentru o tranzacศie de bazฤ de date
Tranzacศia de transfer de bani dintr-un cont bancar รฎn altul va implica cรขteva activitฤศi. Aceastฤ operaศiune de tranzacศie include retragerea banilor din primul cont ศi depunerea acestora รฎn alt cont. Aceastฤ tranzacศie trebuie sฤ fie finalizatฤ sau anulatฤ complet ศi sฤ nu eศueze la jumฤtate.
Iatฤ lista cu cinci rezoluศii pe care le puteศi alege รฎn clauza CONFLICT:
- ROLLBACK โ aceasta va anula tranzacศia รฎn care a fost efectuatฤ tranzacศia curentฤ SQLite declaraศie care are conflictul (va anula รฎntreaga tranzacศie). De exemplu, dacฤ รฎncercaศi sฤ actualizaศi 10 rรขnduri, iar al cincilea rรขnd are o valoare care intrฤ รฎn conflict cu o constrรขngere, atunci niciun rรขnd nu va fi actualizat, cele 10 rรขnduri vor rฤmรขne aceleaศi. O eroare va fi aruncatฤ.
- ABORT โ aceasta va anula (abandona) procesul curent SQLite numai declaraศie care are conflict ศi tranzacศia nu va fi anulatฤ. De exemplu, dacฤ รฎncercaศi sฤ actualizaศi 10 rรขnduri, iar al cincilea rรขnd are o valoare care intrฤ รฎn conflict cu o constrรขngere, atunci numai a cincea valoare nu va fi actualizatฤ, dar celelalte 9 rรขnduri vor fi actualizate. O eroare va fi aruncatฤ.
- EศEC โ รฎntrerupe curentul SQLite declaraศie care are conflictul. Cu toate acestea, tranzacศia nu va continua, dar modificฤrile anterioare aduse rรขndurilor รฎnainte de rรขndul care are conflictul vor fi comise. De exemplu, dacฤ รฎncercaศi sฤ actualizaศi 10 rรขnduri, iar al cincilea rรขnd are o valoare care intrฤ รฎn conflict cu o constrรขngere, atunci numai cele 4 rรขnduri vor fi actualizate, iar celฤlalt nu. O eroare va fi aruncatฤ.
- IGNORE โ aceastฤ funcศie va omite rรขndul care conศine รฎncฤlcarea constrรขngerii ศi va continua procesarea celorlalte rรขnduri urmฤtoare ale SQLite afirmaศie. De exemplu, dacฤ รฎncercaศi sฤ actualizaศi 10 rรขnduri, iar al cincilea rรขnd are o valoare care intrฤ รฎn conflict cu o constrรขngere, atunci numai cele 4 rรขnduri vor fi actualizate, iar celฤlalt nu. Nu va continua sฤ actualizeze alte rรขnduri ศi sฤ se opreascฤ la rรขndul care are valoarea conflictului. Nicio eroare nu va fi aruncatฤ.
- รNLOCUIRE โ depinde de tipul de constrรขngere care are รฎncฤlcarea:
- Cรขnd existฤ o รฎncฤlcare a constrรขngerii pentru constrรขngerea UNIQUE sau PRIMARY KEY. REPLACE va รฎnlocui rรขndul care provoacฤ รฎncฤlcarea cu noul rรขnd inserat sau actualizat.
- Cรขnd existฤ o รฎncฤlcare a constrรขngerii NOT NULL, clauza REPLACE va รฎnlocui valoarea NULL cu valoarea implicitฤ a acelei coloane. Dacฤ coloana nu are o valoare implicitฤ, atunci SQLite va anula declaraศia (declaraศia va fi anulatฤ)
- DACฤ are loc รฎncฤlcarea constrรขngerii CHECK, clauza va fi anulatฤ.
Notฤ: Cele 5 rezolvฤri de mai sus sunt opศiuni pentru modul รฎn care doriศi sฤ rezolvaศi conflictul. Este posibil ca ceea ce este aplicabil pentru a rezolva un conflict sฤ nu fie neapฤrat aplicabil ศi pentru a rezolva alte tipuri de conflicte.
Cum se declarฤ clauza CONFLICT
Puteศi declara clauza ON CONFLICT atunci cรขnd definiศi o constrรขngere pentru definiศia unei coloane รฎn cadrul clauzei CREATE TABLE. Folosind urmฤtoarea sintaxฤ:
Puteศi alege una dintre cele cinci rezoluศii pentru a rezolva conflictul, aศa cum a fost explicat mai sus.
ON CONFLICT IGNORE Exemplu
Pas 1) Creaศi un nou subiect de tabel dupฤ cum urmeazฤ:
CREATE TABLE [Subjects] ( [SubjectId] INTEGER NOT NULL PRIMARY KEY ON CONFLICT IGNORE, [SubjectName] NVARCHAR NOT NULL );
Observaศi cฤ am definit o constrรขngere PRIMARY KEY asupra coloanei SubjectId. Constrรขngerea cheii primare nu va permite inserarea a douฤ valori duplicate รฎn coloana SubjectId, astfel รฎncรขt toate valorile din acea coloanฤ sฤ fie unice. De asemenea, observaศi cฤ am ales ca rezoluศie a conflictelor sฤ fie โIGNORฤโ.
Comanda ar trebui sฤ ruleze cu succes ศi nu ar trebui sฤ primeศti erori:
Pas 2) Acum, sฤ inserฤm cรขteva valori รฎn noile subiecte ale tabelului, dar cu o valoare care รฎncalcฤ constrรขngerea cheii primare:
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');
รn aceste instrucศiuni INSERT, am รฎncercat sฤ inserฤm douฤ cursuri cu acelaศi ID de subiect al cheii primare 2, ceea ce reprezintฤ o รฎncฤlcare a constrรขngerii cheii primare.
Comenzile ar trebui sฤ ruleze bine ศi nu ar trebui sฤ primeศti erori. Dupฤ cum urmeazฤ:
Pas 3) Selectaศi toate subiectele din tabel dupฤ cum urmeazฤ:
SELECT * FROM Subjects;
Aceasta vฤ va oferi lista de subiecte:
Observaศi cฤ au fost inserate doar trei materii โAlgebrฤ, Curs de baze de date ศi Algorithmsโ รฎn loc de 4 rรขnduri.
Rรขndul care are valoarea care รฎncalcฤ constrรขngerea cheii primare, care este โStructuri de dateโ, a fost ignorat ศi nu a fost inserat. In orice caz, SQLite continuฤ sฤ execute alte instrucศiuni dupฤ acel rรขnd.
Pas 4) ศTERGEศI subiectele tabelului pentru a le crea din nou cu o clauzฤ ON CONFLICT diferitฤ pentru urmฤtorul exemplu, rulรขnd urmฤtoarea comandฤ:
DROP TABLE Subjects;
Comanda drop ศterge รฎntregul tabel. Subiectele tabelului acum nu existฤ.
ON CONFLICT REPLACE Exemplu
Pas 1) Creaศi un nou subiect de tabel dupฤ cum urmeazฤ:
CREATE TABLE [Subjects] ( [SubjectId] INTEGER NOT NULL PRIMARY KEY ON CONFLICT REPLACE, [SubjectName] NVARCHAR NOT NULL );
Observaศi cฤ am definit o constrรขngere PRIMARY KEY pe coloana SubjectId. Constrรขngerea cheii primare nu va permite inserarea a douฤ valori duplicate รฎn coloana SubjectId, astfel รฎncรขt toate valorile din acea coloanฤ sฤ fie unice.
De asemenea, observaศi cฤ am ales ca opศiune de rezolvare a conflictelor โREPLACEโ. Comanda ar trebui sฤ ruleze cu succes ศi nu ar trebui sฤ รฎntรขmpinaศi nicio eroare:
Pas 2) Acum, sฤ inserฤm cรขteva valori รฎn noul tabel Subiecte, dar cu o valoare care รฎncalcฤ constrรขngerea cheii primare:
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');
รn aceste instrucศiuni INSERT, am รฎncercat sฤ inserฤm douฤ cursuri cu acelaศi ID de subiect al cheii primare 2, ceea ce reprezintฤ o รฎncฤlcare a constrรขngerii cheii primare.
Comenzile ar trebui sฤ ruleze bine ศi nu ar trebui sฤ primeศti erori. Dupฤ cum urmeazฤ:
Pas 3) Selectaศi toate subiectele din tabel dupฤ cum urmeazฤ:
SELECT * FROM Subjects;
Aceasta vฤ va oferi lista de subiecte:
Observaศi cฤ au fost inserate doar trei materii โAlgebrฤ, Structuri de date ศi Algorithmsโ รฎn timp ce am รฎncercat sฤ introducem 4 rรขnduri.
Rรขndul care are valoarea ce รฎncalcฤ constrรขngerea cheii primare, ศi anume โStructuri de dateโ, a รฎnlocuit valoarea โCurs baza de dateโ dupฤ cum urmeazฤ:
- Primele douฤ instrucศiuni de inserare funcศioneazฤ bine, fฤrฤ probleme. Douฤ materii Algebrฤ ศi Curs de baze de date vor fi inserate cu id-urile 1, 2.
- Atunci cรขnd SQLite รฎncearcฤ sฤ execute a treia instrucศiune de inserare cu SubjectId 2 ศi SubjectName โStructuri de dateโ, descoperฤ cฤ existฤ deja un subiect cu SubjectId = 2. Ceea ce reprezintฤ o รฎncฤlcare a constrรขngerii de cheie primarฤ definitฤ รฎn coloana SubjectId.
- SQLite va alege o soluศie REPLACE pentru acest conflict. รnlocuieศte valoarea care existฤ deja รฎn tabelul de subiecte cu noua valoare din instrucศiunea de inserare. Aศadar, Numele Subiectului din โCurs Bazฤ de Dateโ va fi รฎnlocuit cu Numele Subiectului din โStructuri de Dateโ.


















