SQLite CHÈN, CẬP NHẬT, XÓA Truy vấn với ví dụ
Các điều khoản sửa đổi dữ liệu trong SQLite là các câu lệnh INSERT, UPDATE và DELETE. Nó được sử dụng để chèn các hàng mới, cập nhật các giá trị hiện có hoặc xóa các hàng khỏi cơ sở dữ liệu.
Lưu ý rằng, đối với tất cả các ví dụ sau, bạn phải chạy sqlite3.exe và mở kết nối đến cơ sở dữ liệu mẫu dưới dạng flow:
Bước 1) Trong bước này,
- Mở My Computer và điều hướng đến thư mục sau “C:\sqlite"Và
- Sau đó mở “sqlite3.exe":
Bước 2) Mở cơ sở dữ liệu “Hướng dẫnSampleDB.db” bằng lệnh sau:
.open TutorialsSampleDB.db
Bây giờ bạn đã sẵn sàng chạy bất kỳ loại truy vấn nào trên cơ sở dữ liệu.
SQLite CHÈN
SQLite INSERT được sử dụng để chèn các bản ghi vào một bảng được chỉ định của cơ sở dữ liệu. bạn phải sử dụng mệnh đề 'INSERT'. Cú pháp mệnh đề INSERT như sau:
- Sau mệnh đề INSERT, bạn nên nêu rõ bảng nào bạn cần chèn các giá trị vào.
- Sau tên bảng các bạn viết danh sách các cột muốn chèn giá trị vào.
- Bạn có thể bỏ qua tên cột và không viết thư cho chúng.
- Nếu không ghi tên cột thì các giá trị sẽ được chèn vào tất cả các cột tìm thấy trong bảng theo cùng thứ tự, các cột được xác định trong bảng.
- Sau mệnh đề VALUES, bạn nên liệt kê các giá trị cần chèn.
- Mỗi mệnh đề INSERT chỉ chèn một hàng. Nếu bạn muốn chèn nhiều hàng, bạn nên viết nhiều mệnh đề INSERT, mỗi mệnh đề cho một hàng.
SQLite Chèn ví dụ
Trong ví dụ sau, chúng ta sẽ chèn 2 hàng vào bảng học sinh, mỗi hàng cho một học sinh:
INSERT INTO Students(StudentId, StudentName, DepartmentId, DateOfBirth) VALUES(11, 'Ahmad', 4, '1997-10-12'); INSERT INTO Students VALUES(12, 'Aly', 4, '1996-10-12');
Điều này sẽ chạy thành công và không có đầu ra cho việc này:
Điều này sẽ chèn hai sinh viên:
- Sinh viên đầu tiên có Sinh viênId=11, Sinh viênName = Ahmad, DepartmentId = 4 và DateOfBirth = 1997-10-12.
- Sinh viên thứ hai có Sinh viênId=12, Sinh viênName = Aly, DepartmentId = 4, và DateOfBirth = 1996-10-12′.
Trong câu lệnh đầu tiên, chúng tôi đã liệt kê tên các cột “Mã sinh viên, Tên sinh viên, Mã khoa, Ngày sinh“Tuy nhiên, trong tuyên bố thứ hai, chúng tôi đã không làm như vậy.
Bốn giá trị “12, 'Aly', 4, '1996-10-12'” sẽ được chèn vào tất cả bốn cột của bảng Sinh viên theo đúng thứ tự các cột được xác định.
Bây giờ, hãy xác minh rằng hai sinh viên đã được chèn vào bảng Students bằng cách chạy lệnh sau truy vấn:
SELECT * FROM Students;
Sau đó bạn sẽ thấy kết quả trả về từ truy vấn đó như sau:
SQLite Cập nhật
SQLite Truy vấn UPDATE được sử dụng để sửa đổi các bản ghi hiện có trong một bảng. Bạn có thể sử dụng mệnh đề WHERE với truy vấn UPDATE để cập nhật các hàng đã chọn. Mệnh đề UPDATE cập nhật một bảng bằng cách thay đổi giá trị cho một cột cụ thể. Sau đây là cú pháp của mệnh đề UPDATE:
Như sau:
- Sau “mệnh đề cập nhật”, bạn nên viết tên bảng cần cập nhật.
- Bạn phải viết “mệnh đề SET” được sử dụng để viết tên cột cần cập nhật và giá trị cần cập nhật.
- Bạn có thể cập nhật nhiều cột. Bạn có thể sử dụng dấu phẩy giữa mỗi dòng.
- Bạn có thể chỉ định mệnh đề WHERE để chỉ chỉ định một số hàng. Chỉ những hàng mà biểu thức đánh giá là đúng mới được cập nhật. Nếu bạn không chỉ định mệnh đề WHERE thì tất cả các hàng sẽ được cập nhật.
SQLite Cập nhật ví dụ
Trong câu lệnh UPDATE sau, chúng ta sẽ cập nhật DepartmentId cho Student có StudentId = 6 thành 3:
UPDATE Students SET DepartmentId = 3 WHERE StudentId = 6;
Điều này sẽ chạy thành công và bạn sẽ không nhận được bất kỳ kết quả đầu ra nào:
Trong mệnh đề UPDATE, chúng ta đã chỉ định rằng chúng ta muốn cập nhật bảng Sinh viên.
- Trong mệnh đề WHERE, chúng ta đã lọc tất cả các sinh viên để chỉ chọn hàng có ID sinh viên = 6.
- Mệnh đề SET sẽ cập nhật giá trị Id Khoa cho các sinh viên được chọn thành 3.
Bây giờ, hãy xác minh rằng học sinh có ID 6 đã được cập nhật bằng cách chạy lệnh sau:
SELECT * FROM Students WHERE StudentId = 6;
Bây giờ bạn sẽ thấy giá trị Department Id là 3 như sau:
SQLite Xóa bỏ
SQLite Truy vấn DELETE được sử dụng để xóa các bản ghi hiện có khỏi một bảng được chỉ định. Bạn có thể sử dụng mệnh đề WHERE với truy vấn DELETE để xóa các hàng đã chọn.
Mệnh đề DELETE có cú pháp như sau:
- Bạn phải viết tên bảng sau mệnh đề DELETE FROM mà bạn muốn xóa các bản ghi. (Lưu ý: rằng mệnh đề DELETE được sử dụng để xóa một số bản ghi khỏi bảng hoặc xóa tất cả các bản ghi và nó sẽ không xóa bảng đó. Tuy nhiên, mệnh đề DROP được sử dụng để xóa toàn bộ bảng với tất cả các bản ghi trên đó.)
- Nếu bạn viết mệnh đề DELETE như thế này “DELETE FROM guru”, thao tác này sẽ xóa tất cả các bản ghi khỏi bảng “guru”.
- Bạn có thể chỉ định điều kiện WHERE bằng một biểu thức nếu bạn muốn xóa một số hàng cụ thể. Chỉ những hàng mà biểu thức đánh giá là đúng mới bị xóa. Ví dụ: “DELETE FROM guru WHERE id > 5” – thao tác này sẽ chỉ xóa các bản ghi có id lớn hơn 5.
Ví dụ
Trong câu lệnh sau, chúng ta sẽ xóa hai sinh viên có StudentId là 11 và 12:
DELETE FROM Students WHERE StudentId = 11 OR StudentId = 12;
Cách diễn đạt "ID sinh viên = 11 HOẶC ID sinh viên = 12” sẽ chỉ đúng với những học sinh có Id 11 và 12. Vì vậy mệnh đề DELETE sẽ được áp dụng cho cả hai và sẽ chỉ xóa chúng.
Lệnh này sẽ chạy thành công và bạn sẽ không nhận được bất kỳ kết quả nào như sau:
Bạn có thể xác minh rằng hai học sinh đã bị xóa bằng cách chọn tất cả các bản ghi từ bảng Học sinh như sau:
SELECT * FROM Students;
Bạn không nên nhìn thấy hai học sinh có id 11 và 12 như sau:
SQLite Điều khoản xung đột
Giả sử bạn có một cột có một trong các ràng buộc cột sau: UNIQUE, NOT NULL, CHECK hoặc PRIMARY KEY. Sau đó, bạn thử chèn hoặc cập nhật giá trị trên cột đó bằng giá trị xung đột với ràng buộc này.
Ví dụ: nếu một cột có ràng buộc ĐỘC ĐÁO và bạn đã cố gắng chèn một giá trị đã tồn tại (giá trị trùng lặp), điều này xung đột với ràng buộc ĐỘC ĐÁO. Sau đó, mệnh đề CONFLICT cho phép bạn chọn những việc cần làm trong những trường hợp như vậy để giải quyết xung đột này.
Trước khi chúng ta tiếp tục giải thích cách mệnh đề CONFLICT giải quyết xung đột. Bạn nên hiểu giao dịch cơ sở dữ liệu là gì.
Giao dịch cơ sở dữ liệu
Thuật ngữ giao dịch cơ sở dữ liệu là một danh sách các SQLite hoạt động (chèn hoặc cập nhật hoặc xóa). Giao dịch cơ sở dữ liệu phải được thực hiện như một đơn vị, hoặc tất cả các hoạt động được thực hiện thành công hoặc không thực hiện. Tất cả các hoạt động sẽ bị hủy nếu một trong số chúng không thực hiện được.
Ví dụ về giao dịch cơ sở dữ liệu
Giao dịch chuyển tiền từ tài khoản ngân hàng này sang tài khoản ngân hàng khác sẽ bao gồm một số hoạt động. Hoạt động giao dịch này bao gồm việc rút tiền từ tài khoản đầu tiên và gửi vào tài khoản khác. Giao dịch này phải được hoàn thành đầy đủ hoặc bị hủy bỏ hoàn toàn và không được bỏ sót giữa chừng.
Dưới đây là danh sách năm giải pháp bạn có thể chọn trong mệnh đề CONFLICT:
- QUAY LẠI – điều này sẽ khôi phục giao dịch trong đó giá trị hiện tại SQLite tuyên bố có xung đột (nó sẽ hủy toàn bộ giao dịch). Ví dụ: nếu bạn đang cố cập nhật 10 hàng và hàng thứ năm có giá trị xung đột với một ràng buộc thì sẽ không có hàng nào được cập nhật, 10 hàng sẽ giữ nguyên. Một lỗi sẽ được đưa ra.
- HUỶ BỎ – điều này sẽ hủy bỏ (hủy bỏ) hiện tại SQLite chỉ tuyên bố có xung đột và giao dịch sẽ không bị hủy. Ví dụ: nếu bạn đang cố cập nhật 10 hàng và hàng thứ năm có giá trị xung đột với một ràng buộc thì chỉ giá trị thứ năm sẽ không được cập nhật nhưng 9 hàng còn lại sẽ được cập nhật. Một lỗi sẽ được đưa ra.
- THẤT BẠI - hủy bỏ hiện tại SQLite tuyên bố có mâu thuẫn. Tuy nhiên, giao dịch sẽ không tiếp tục nhưng những thay đổi trước đó được thực hiện đối với các hàng trước hàng có xung đột sẽ được thực hiện. Ví dụ: nếu bạn đang cố cập nhật 10 hàng và hàng thứ năm có giá trị xung đột với một ràng buộc thì chỉ 4 hàng sẽ được cập nhật còn hàng kia thì không. Một lỗi sẽ được đưa ra.
- VÒI – điều này sẽ bỏ qua hàng chứa vi phạm ràng buộc và tiếp tục xử lý các hàng tiếp theo khác của SQLite tuyên bố. Ví dụ: nếu bạn đang cố cập nhật 10 hàng và hàng thứ năm có giá trị xung đột với một ràng buộc thì chỉ 4 hàng sẽ được cập nhật còn hàng kia thì không. Nó sẽ không tiếp tục cập nhật các hàng khác và dừng ở hàng có giá trị xung đột. Sẽ không có lỗi nào được đưa ra.
- Thay thế – nó phụ thuộc vào loại ràng buộc có vi phạm:
- Khi có vi phạm ràng buộc đối với ràng buộc UNIQUE hoặc PRIMARY KEY. REPLACE sẽ thay thế hàng gây ra vi phạm bằng hàng mới được chèn hoặc cập nhật.
- Khi có vi phạm ràng buộc NOT NULL, mệnh đề REPLACE sẽ thay thế giá trị NULL bằng giá trị mặc định của cột đó. Nếu cột không có giá trị mặc định thì SQLite sẽ hủy bỏ câu lệnh (câu lệnh sẽ bị hủy)
- NẾU vi phạm ràng buộc CHECK xảy ra, mệnh đề sẽ bị hủy bỏ.
Lưu ý: 5 cách giải quyết trên là những lựa chọn về cách bạn muốn giải quyết xung đột. Có thể không nhất thiết những gì áp dụng được để giải quyết một xung đột có thể áp dụng được để giải quyết các loại xung đột khác.
Cách khai báo mệnh đề CONFLICT
Bạn có thể khai báo mệnh đề ON CONFLICT khi bạn định nghĩa ràng buộc cho định nghĩa cột trong mệnh đề CREATE TABLE. Sử dụng cú pháp sau:
Bạn có thể chọn một trong năm giải pháp để giải quyết xung đột như đã giải thích trước đó.
VỀ VIỆC BỎ QUA XUNG ĐỘT
Bước 1) Tạo một chủ đề bảng mới như sau:
CREATE TABLE [Subjects] ( [SubjectId] INTEGER NOT NULL PRIMARY KEY ON CONFLICT IGNORE, [SubjectName] NVARCHAR NOT NULL );
Lưu ý rằng chúng tôi đã xác định ràng buộc PRIMARY KEY trên cột Chủ đề. Ràng buộc khóa chính sẽ không cho phép chèn hai giá trị trùng lặp vào cột ID chủ đề để tất cả các giá trị trong cột đó phải là duy nhất. Ngoài ra, hãy lưu ý rằng chúng tôi chọn cách giải quyết xung đột là “VÒI".
Lệnh sẽ chạy thành công và bạn sẽ không gặp bất kỳ lỗi nào:
Bước 2) Bây giờ, hãy chèn một số giá trị vào các chủ đề của bảng mới, nhưng với giá trị vi phạm ràng buộc khóa chính:
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');
Trong câu lệnh INSERT này, chúng tôi đã cố gắng chèn hai khóa học có cùng id Chủ đề khóa chính 2, điều này vi phạm ràng buộc khóa chính.
Các lệnh sẽ chạy tốt và bạn sẽ không gặp bất kỳ lỗi nào. Như sau:
Bước 3) Chọn tất cả các chủ đề trong bảng như sau:
SELECT * FROM Subjects;
Điều này sẽ cung cấp cho bạn danh sách các chủ đề:
Lưu ý rằng chỉ có ba chủ đề được chèn “Khóa học Đại số, Cơ sở dữ liệu và Algorithms” thay vì 4 hàng.
Hàng có giá trị vi phạm ràng buộc khóa chính là “Cấu trúc dữ liệu” đã bị bỏ qua và không được chèn. Tuy nhiên, SQLite tiếp tục thực hiện các câu lệnh khác sau hàng đó.
Bước 4) XÓA bảng subject để tạo lại bảng đó với mệnh đề ON CONFLICT khác cho ví dụ sau bằng cách chạy lệnh sau:
DROP TABLE Subjects;
Lệnh thả sẽ xóa toàn bộ bảng. Chủ đề bảng bây giờ không tồn tại.
VỀ Ví dụ thay thế xung đột
Bước 1) Tạo một chủ đề bảng mới như sau:
CREATE TABLE [Subjects] ( [SubjectId] INTEGER NOT NULL PRIMARY KEY ON CONFLICT REPLACE, [SubjectName] NVARCHAR NOT NULL );
Lưu ý rằng chúng tôi đã xác định ràng buộc PRIMARY KEY trên cộtSubjectId. Ràng buộc khóa chính sẽ không cho phép chèn hai giá trị trùng lặp vào cột ID chủ đề để tất cả các giá trị trong cột đó phải là duy nhất.
Ngoài ra, hãy lưu ý rằng chúng tôi chọn tùy chọn giải quyết xung đột là “Thay thế“. Lệnh sẽ chạy thành công và bạn sẽ không gặp bất kỳ lỗi nào:
Bước 2) Bây giờ, hãy chèn một số giá trị vào bảng mới Chủ đề, nhưng với giá trị vi phạm ràng buộc khóa chính:
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');
Trong câu lệnh INSERT này, chúng tôi đã cố gắng chèn hai khóa học có cùng id Chủ đề khóa chính 2, điều này vi phạm ràng buộc khóa chính.
Các lệnh sẽ chạy tốt và bạn sẽ không gặp bất kỳ lỗi nào. Như sau:
Bước 3) Chọn tất cả các chủ đề trong bảng như sau:
SELECT * FROM Subjects;
Điều này sẽ cung cấp cho bạn danh sách các chủ đề:
Lưu ý rằng chỉ có ba chủ đề được chèn “Đại số, cấu trúc dữ liệu và Algorithms” trong khi chúng tôi đã cố gắng chèn 4 hàng.
Hàng có giá trị vi phạm ràng buộc khóa chính, đó là “Cấu trúc dữ liệu” thay thế giá trị “Khóa học cơ sở dữ liệu” như sau:
- Hai câu lệnh chèn đầu tiên chạy tốt mà không gặp vấn đề gì. Hai môn Đại số và Khóa học Cơ sở dữ liệu sẽ được chèn với id 1, 2.
- Thời Gian SQLite cố gắng chạy câu lệnh chèn thứ ba với Chủ đềId 2 và Tên chủ đề “Cấu trúc dữ liệu“, nó phát hiện ra rằng đã có một chủ đề có Chủ đềId = 2. Điều này vi phạm ràng buộc khóa chính được xác định trên cột Chủ đềId.
- SQLite sẽ chọn giải pháp THAY THẾ cho xung đột này. Nó thay thế giá trị đã tồn tại trong bảng chủ đề bằng giá trị mới từ câu lệnh chèn. Nên "Khóa học cơ sở dữ liệu” Tên chủ đề sẽ được thay thế bằng “Cấu trúc dữ liệu" Tên chủ đề.
Tổng kết
Các mệnh đề INSERT, UPDATE và DELETE được sử dụng để sửa đổi dữ liệu trong SQLite cơ sở dữ liệu. Mệnh đề CONFLICT là một mệnh đề mạnh mẽ để giải quyết mọi xung đột giữa dữ liệu và dữ liệu cần sửa đổi.