SQLite INSERT, UPDATE, DELETE Interogare cu exemplu
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 baza de date โTutorialeSampleDB.dbโ prin 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 declaraศie, am enumerat numele coloanelor โStudentId, StudentName, DepartmentId, DateOfBirthโ.Totuศi, รฎn a doua declaraศie, nu am fฤcut-o.
Cele patru valoriโ12, โAlyโ, 4, โ1996-10-12โโ va fi inserat รฎ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ฤ: faptul cฤ clauza DELETE este folosit pentru a ศterge unele รฎnregistrฤri dintr-un tabel sau pentru a ศterge toate รฎnregistrฤrile ศi nu va ศterge tabelul รฎn sine. รnsฤ clauza DROP este folosit pentru a ศterge รฎntregul tabel cu toate รฎnregistrฤrile de pe el.)
- 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 SAU StudentId = 12โ va fi valabilฤ numai pentru studenศii cu Id-urile 11 ศi 12. Deci clauza DELETE va fi aplicatฤ pe ambele ศi le va ศterge numai.
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:
- REALIZARE โ aceasta va derula รฎnapoi tranzacศia รฎn care este 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ฤ.
- AVORT โ aceasta va anula (anula) curentul 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ฤ.
- ESCฤ - รฎ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ฤ.
- IGNORA โ aceasta va sฤri peste 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ฤ.
- A INLOCUI โ 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 rezoluศii de mai sus sunt opศiuni pentru cum doriศi sฤ rezolvaศi conflictul. Este posibil sฤ nu fie neapฤrat ceea ce este aplicabil pentru a rezolva un conflict este aplicabil 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 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ฤ alegem o soluศie de conflict care sฤ fie โIGNORA".
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 introduse doar trei subiecte โ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ฤ alegem o opศiune de rezolvare a conflictelor sฤ fie โA INLOCUIโ. 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 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 introduse doar trei subiecte โAlgebrฤ, structuri de date ศi Algorithmsโ รฎn timp ce am รฎncercat sฤ introducem 4 rรขnduri.
Rรขndul care are valoarea care รฎncalcฤ constrรขngerea cheii primare, care este โStructuri de dateโ a รฎnlocuit valoarea โCurs de baze 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ฤ ruleze a treia instrucศiune de inserare cu SubjectId 2 ศi SubjectName โStructuri de dateโ, aflฤ cฤ existฤ deja un subiect cu SubjectId = 2. Ceea ce este o รฎncฤlcare pentru constrรขngerea cheii primare definitฤ รฎn coloana SubjectId.
- SQLite va alege o rezoluศie REPLACE pentru acest conflict. รnlocuieศte valoarea care existฤ deja รฎn tabelul de subiecte cu noua valoare din instrucศiunea insert. Asa ca "Curs de baze de dateโ SubjectName va fi รฎnlocuit cu โStructuri de dateโ SubiectNume.
Rezumat
Clauzele INSERT, UPDATE ศi DELETE sunt folosite pentru a modifica datele din SQLite Baza de date. Clauza CONFLICT este o clauzฤ puternicฤ pentru a rezolva orice conflict รฎntre date ศi datele de modificat.


















