SQLite แทรก อัปเดต ลบแบบสอบถามพร้อมตัวอย่าง
ส่วนการแก้ไขข้อมูลใน SQLite คือคำสั่ง INSERT, UPDATE และ DELETE ใช้สำหรับการแทรกแถวใหม่ อัปเดตค่าที่มีอยู่ หรือการลบแถวออกจากฐานข้อมูล
โปรดทราบว่าสำหรับตัวอย่างทั้งหมดต่อไปนี้ คุณต้องเรียกใช้ sqlite3.exe และเปิดการเชื่อมต่อกับฐานข้อมูลตัวอย่างแบบไหล:
ขั้นตอน 1) ในขั้นตอนนี้
- เปิด My Computer และไปที่ไดเร็กทอรีต่อไปนี้ “C:\sqlite"และ
- แล้วเปิด”sqlite3.exe"
ขั้นตอน 2) เปิดฐานข้อมูล “บทช่วยสอนSampleDB.db” โดยคำสั่งต่อไปนี้:
.open TutorialsSampleDB.db
ตอนนี้คุณพร้อมที่จะเรียกใช้แบบสอบถามประเภทใดก็ได้บนฐานข้อมูลแล้ว
SQLite INSERT
SQLite INSERT ใช้เพื่อแทรกบันทึกลงในตารางที่ระบุของฐานข้อมูล คุณต้องใช้ส่วนคำสั่ง 'INSERT' ไวยากรณ์ส่วนคำสั่ง INSERT เป็นดังนี้:
- หลังจากส่วนคำสั่ง INSERT คุณควรระบุตารางที่คุณต้องการแทรกค่าลงไป
- หลังจากชื่อตารางที่คุณเขียนรายการคอลัมน์ คุณต้องการแทรกค่าลงไป
- คุณสามารถละเว้นชื่อคอลัมน์และไม่ต้องเขียนลงไป
- หากคุณไม่เขียนชื่อคอลัมน์ ค่าต่างๆ จะถูกแทรกลงในคอลัมน์ทั้งหมดที่พบในตารางโดยมีลำดับเดียวกัน โดยคอลัมน์ต่างๆ จะถูกกำหนดไว้ในตาราง
- หลังส่วนคำสั่ง VALUES คุณควรแสดงรายการค่าที่จะแทรก
- แต่ละคำสั่ง INSERT จะแทรกเพียงแถวเดียวเท่านั้น หากคุณต้องการแทรกหลายแถว คุณควรเขียนส่วนคำสั่ง INSERT หลายรายการ หนึ่งรายการสำหรับแต่ละแถว
SQLite แทรกตัวอย่าง
ในตัวอย่างต่อไปนี้ เราจะแทรกแถว 2 แถวลงในตารางนักเรียน แถวละแถวสำหรับนักเรียนแต่ละคน:
INSERT INTO Students(StudentId, StudentName, DepartmentId, DateOfBirth) VALUES(11, 'Ahmad', 4, '1997-10-12'); INSERT INTO Students VALUES(12, 'Aly', 4, '1996-10-12');
สิ่งนี้ควรจะทำงานได้สำเร็จและไม่มีเอาต์พุตสำหรับสิ่งนี้:
สิ่งนี้จะแทรกนักเรียนสองคน:
- นักเรียนคนแรกที่มี StudentId=11, StudentName = Ahmad, DepartmentId = 4 และ DateOfBirth = 1997-10-12
- นักเรียนคนที่สองที่มี StudentId=12, StudentName = Aly, DepartmentId = 4 และ DateOfBirth = 1996-10-12′
ในคำสั่งแรก เราแสดงรายการชื่อคอลัมน์ “StudentId, StudentName, DepartmentId, วันเกิด“.อย่างไรก็ตาม ในข้อความที่สอง เราไม่ได้ทำ
คุณค่าสี่ประการ”12, 'อาลี', 4, '1996-10-12'” จะถูกแทรกลงในคอลัมน์ทั้งสี่คอลัมน์ของตารางนักเรียนในลำดับเดียวกันกับคอลัมน์ที่กำหนดไว้
ตอนนี้เรามาตรวจสอบว่านักเรียนทั้งสองคนถูกแทรกเข้าไปในตารางนักเรียนหรือไม่โดยรันคำสั่งต่อไปนี้ การสอบถาม:
SELECT * FROM Students;
จากนั้นคุณควรจะเห็นนักเรียนทั้งสองคนกลับมาจากการค้นหาดังต่อไปนี้:
SQLite บันทึก
SQLite คำสั่ง UPDATE ใช้เพื่อแก้ไขระเบียนที่มีอยู่ในตาราง คุณสามารถใช้คำสั่ง WHERE กับคำสั่ง UPDATE เพื่ออัปเดตแถวที่เลือก คำสั่ง UPDATE จะอัปเดตตารางโดยเปลี่ยนค่าสำหรับคอลัมน์ที่ระบุ ต่อไปนี้คือไวยากรณ์ของคำสั่ง UPDATE:
ดังต่อไปนี้:
- หลัง "ส่วนคำสั่งอัปเดต" คุณควรเขียนชื่อตารางที่จะอัปเดต
- คุณต้องเขียน “SET clause” ซึ่งใช้สำหรับเขียนชื่อคอลัมน์ที่จะอัพเดตและค่าที่จะอัพเดต
- คุณสามารถอัปเดตได้มากกว่าหนึ่งคอลัมน์ คุณสามารถใช้ลูกน้ำระหว่างแต่ละบรรทัดได้
- คุณสามารถระบุส่วนคำสั่ง WHERE เพื่อระบุบางแถวเท่านั้น เฉพาะแถวที่นิพจน์ประเมินว่าเป็นจริงเท่านั้นที่จะได้รับการอัปเดต หากคุณไม่ได้ระบุส่วนคำสั่ง WHERE แถวทั้งหมดจะได้รับการอัปเดต
SQLite อัปเดตตัวอย่าง
ในคำสั่ง UPDATE ต่อไปนี้ เราจะอัปเดต DepartmentId สำหรับ Student ที่มี StudentId = 6 ให้เป็น 3:
UPDATE Students SET DepartmentId = 3 WHERE StudentId = 6;
สิ่งนี้ควรจะทำงานได้สำเร็จและคุณไม่ควรได้รับผลลัพธ์ใด ๆ :
ในส่วนคำสั่ง UPDATE เราระบุว่าเราต้องการอัปเดตตารางนักเรียน
- ในส่วนคำสั่ง WHERE เราได้กรองนักเรียนทั้งหมดเพื่อเลือกเฉพาะแถวสำหรับ StudentId = 6
- SET clause จะอัพเดทค่ารหัสแผนกสำหรับนักศึกษาที่เลือกเป็น 3
ตอนนี้เรามาตรวจสอบว่านักเรียนที่มี ID 6 ได้รับการอัปเดตหรือไม่โดยรันคำสั่งต่อไปนี้:
SELECT * FROM Students WHERE StudentId = 6;
ตอนนี้คุณน่าจะเห็นแล้วว่าค่า Department Id คือ 3 ดังต่อไปนี้:
SQLite ลบ
SQLite แบบสอบถาม DELETE ใช้เพื่อลบระเบียนที่มีอยู่ออกจากตารางที่ระบุ คุณสามารถใช้ส่วนคำสั่ง WHERE ร่วมกับคำสั่ง DELETE เพื่อลบแถวที่เลือกได้
คำสั่ง DELETE มีรูปแบบดังต่อไปนี้:
- คุณต้องเขียนชื่อตารางหลังส่วนคำสั่ง DELETE FROM ที่คุณต้องการลบระเบียน -หมายเหตุ that the ลบข้อ ใช้เพื่อลบบางระเบียนออกจากตารางหรือลบระเบียนทั้งหมดและจะไม่ลบตารางนั้นเอง อย่างไรก็ตาม ประโยค DROP ใช้เพื่อลบตารางทั้งหมดโดยมีบันทึกทั้งหมดอยู่)
- หากคุณเขียนคำสั่งย่อย DELETE เช่น "DELETE FROM guru" การดำเนินการนี้จะลบบันทึกทั้งหมดออกจากตาราง "guru"
- คุณสามารถระบุเงื่อนไข WHERE ด้วยนิพจน์ได้หากต้องการลบบางแถวที่ต้องการ เฉพาะแถวที่นิพจน์ประเมินว่าเป็นจริงเท่านั้นที่จะถูกลบ ตัวอย่างเช่น “DELETE FROM guru WHERE id > 5” – การดำเนินการนี้จะลบเฉพาะระเบียนที่มี ID ใหญ่กว่า 5
ตัวอย่าง
ในคำสั่งต่อไปนี้ เราจะลบข้อมูลนักศึกษาสองคนที่มี StudentId 11 และ 12:
DELETE FROM Students WHERE StudentId = 11 OR StudentId = 12;
การแสดงออก "StudentId = 11 หรือ StudentId = 12” จะเป็นจริงสำหรับนักเรียนที่มี Ids 11 และ 12 เท่านั้น ดังนั้น DELETE clause จะถูกนำไปใช้กับทั้งสองและจะลบออกเท่านั้น
คำสั่งนี้ควรทำงานได้สำเร็จและคุณไม่ควรได้รับผลลัพธ์ใดๆ ดังต่อไปนี้:
คุณสามารถตรวจสอบว่าลบนักเรียนทั้งสองคนแล้วหรือไม่ โดยเลือกรายการทั้งหมดจากตารางนักเรียนดังต่อไปนี้:
SELECT * FROM Students;
คุณไม่ควรเห็นนักเรียนสองคนที่มีรหัส 11 และ 12 ดังนี้:
SQLite ข้อขัดแย้ง
สมมติว่าคุณมีคอลัมน์ที่มีข้อจำกัดคอลัมน์อย่างใดอย่างหนึ่งต่อไปนี้: UNIQUE, NOT NULL, CHECK หรือ PRIMARY KEY จากนั้นคุณพยายามแทรกหรืออัปเดตค่าในคอลัมน์นั้นด้วยค่าที่ขัดแย้งกับข้อจำกัดนี้
ตัวอย่างเช่น หากคอลัมน์มีข้อจำกัด UNIQUE และคุณพยายามแทรกค่าที่มีอยู่แล้ว (ค่าที่ซ้ำกัน) ซึ่งขัดแย้งกับข้อจำกัด UNIQUE จากนั้นส่วนคำสั่ง CONFLICT ให้คุณเลือกว่าจะทำอย่างไรในกรณีดังกล่าวเพื่อแก้ไขข้อขัดแย้งนี้
ก่อนที่เราจะอธิบายต่อไปว่าส่วนคำสั่ง CONFLICT แก้ไขข้อขัดแย้งได้อย่างไร คุณควรเข้าใจว่าธุรกรรมฐานข้อมูลคืออะไร
ธุรกรรมฐานข้อมูล
ธุรกรรมฐานข้อมูลระยะเป็นรายการของ SQLite การดำเนินการ (แทรก อัปเดต หรือลบ) ธุรกรรมฐานข้อมูลจะต้องดำเนินการเป็นหน่วยเดียว ซึ่งอาจดำเนินการทั้งหมดสำเร็จหรือไม่สำเร็จเลยก็ได้ การดำเนินการทั้งหมดจะถูกยกเลิกหากการดำเนินการใดการดำเนินการหนึ่งล้มเหลว
ตัวอย่างธุรกรรมฐานข้อมูล
การทำธุรกรรมโอนเงินจากบัญชีธนาคารหนึ่งไปยังอีกบัญชีหนึ่งนั้นจะมีขั้นตอนการดำเนินการหลายอย่าง การดำเนินการธุรกรรมนี้รวมถึงการถอนเงินจากบัญชีแรกและฝากเข้าในบัญชีอื่น ธุรกรรมนี้จะต้องเสร็จสมบูรณ์หรือยกเลิกอย่างสมบูรณ์และไม่ล้มเหลวระหว่างทาง
ต่อไปนี้เป็นรายการมติห้าประการที่คุณสามารถเลือกได้ในส่วนข้อขัดแย้ง:
- ย้อนกลับ – สิ่งนี้จะย้อนกลับการทำธุรกรรมในปัจจุบัน SQLite Statement ที่มีข้อขัดแย้ง (จะยกเลิกรายการทั้งหมด) ตัวอย่างเช่น หากคุณกำลังพยายามอัปเดต 10 แถว และแถวที่ 10 มีค่าที่ขัดแย้งกับข้อจำกัด จะไม่มีการอัปเดตแถว XNUMX แถวจะยังคงเหมือนเดิม จะเกิดข้อผิดพลาด
- ยกเลิก – สิ่งนี้จะยกเลิก (ยกเลิก) ปัจจุบัน SQLite เฉพาะใบแจ้งยอดที่มีข้อขัดแย้งและรายการจะไม่ถูกยกเลิก ตัวอย่างเช่น หากคุณกำลังพยายามอัปเดต 10 แถว และแถวที่ห้ามีค่าที่ขัดแย้งกับข้อจำกัด ระบบจะไม่อัปเดตเฉพาะค่าที่ห้า แต่อีก 9 แถวที่เหลือจะได้รับการอัปเดต จะเกิดข้อผิดพลาด
- ล้มเหลว - ยกเลิกกระแส SQLite คำกล่าวที่มีความขัดแย้ง อย่างไรก็ตาม ธุรกรรมจะไม่ดำเนินต่อไปแต่การเปลี่ยนแปลงก่อนหน้าที่ทำกับแถวก่อนหน้าแถวที่มีข้อขัดแย้งจะถูกคอมมิต ตัวอย่างเช่น หากคุณกำลังพยายามอัปเดต 10 แถว และแถวที่ห้ามีค่าที่ขัดแย้งกับข้อจำกัด จะมีเพียง 4 แถวเท่านั้นที่จะได้รับการอัปเดต และอีกแถวจะไม่อัปเดต จะเกิดข้อผิดพลาด
- ไม่สนใจ – การดำเนินการนี้จะข้ามแถวที่มีการละเมิดข้อจำกัดและดำเนินการประมวลผลแถวอื่นๆ ต่อไปของ SQLite คำแถลง. ตัวอย่างเช่น หากคุณกำลังพยายามอัปเดต 10 แถว และแถวที่ห้ามีค่าที่ขัดแย้งกับข้อจำกัด จะมีเพียง 4 แถวเท่านั้นที่จะได้รับการอัปเดต และอีกแถวจะไม่อัปเดต จะไม่ดำเนินการอัปเดตแถวอื่นๆ เพิ่มเติมและหยุดที่แถวที่มีค่าความขัดแย้ง จะไม่มีข้อผิดพลาดเกิดขึ้น
- REPLACE – ขึ้นอยู่กับประเภทของข้อจำกัดที่มีการละเมิด:
- เมื่อมีการละเมิดข้อจำกัดสำหรับข้อจำกัด UNIQUE หรือ PRIMARY KEY REPLACE จะแทนที่แถวที่ทำให้เกิดการละเมิดด้วยแถวใหม่ที่แทรกหรืออัปเดต
- เมื่อมีการละเมิดข้อจำกัด NOT NULL ส่วนคำสั่ง REPLACE จะแทนที่ค่า NULL ด้วยค่าเริ่มต้นของคอลัมน์นั้น หากคอลัมน์ไม่มีค่าเริ่มต้น SQLite จะยกเลิกใบแจ้งยอด (ใบแจ้งยอดจะถูกยกเลิก)
- หากการละเมิดข้อจำกัด CHECK เกิดขึ้น ส่วนคำสั่งจะถูกยกเลิก
หมายเหตุ ความละเอียด 5 ข้อข้างต้นเป็นตัวเลือกว่าคุณต้องการแก้ไขข้อขัดแย้งอย่างไร อาจไม่จำเป็นว่าสิ่งที่สามารถนำมาใช้ในการแก้ไขข้อขัดแย้งประการหนึ่งสามารถนำไปใช้กับการแก้ไขข้อขัดแย้งประเภทอื่นได้
วิธีการประกาศส่วนคำสั่ง CONFLICT
คุณสามารถประกาศคำสั่ง ON CONFLICT ได้เมื่อคุณกำหนดข้อจำกัดสำหรับคำจำกัดความของคอลัมน์ภายในคำสั่ง CREATE TABLE โดยใช้รูปแบบต่อไปนี้:
คุณสามารถเลือกหนึ่งข้อจากมติทั้งห้าข้อเพื่อแก้ไขข้อขัดแย้งตามที่อธิบายไว้ก่อนหน้านี้
ตัวอย่างการเพิกเฉยต่อความขัดแย้ง
ขั้นตอน 1) สร้างหัวข้อตารางใหม่ดังต่อไปนี้:
CREATE TABLE [Subjects] ( [SubjectId] INTEGER NOT NULL PRIMARY KEY ON CONFLICT IGNORE, [SubjectName] NVARCHAR NOT NULL );
โปรดสังเกตว่าเราได้กำหนดข้อจำกัดคีย์หลักในคอลัมน์ SubjectId ข้อจำกัดของคีย์หลักจะไม่อนุญาตให้แทรกค่าที่ซ้ำกันสองค่าลงในคอลัมน์ SubjectId เพื่อให้ค่าทั้งหมดในคอลัมน์นั้นไม่ซ้ำกัน นอกจากนี้โปรดสังเกตว่าเราเลือกการแก้ไขข้อขัดแย้งเป็น “ไม่สนใจ"
คำสั่งควรทำงานได้สำเร็จและคุณไม่ควรได้รับข้อผิดพลาดใดๆ:
ขั้นตอน 2) ตอนนี้ เรามาแทรกค่าบางค่าลงในหัวข้อตารางใหม่ แต่ด้วยค่าที่ฝ่าฝืนข้อจำกัดของคีย์หลัก:
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');
ในคำสั่ง INSERT เหล่านี้ เราพยายามแทรกสองหลักสูตรที่มี Primary Key Subject id 2 เหมือนกัน ซึ่งเป็นการละเมิดข้อจำกัดของคีย์หลัก
คำสั่งควรทำงานได้ดีและคุณจะไม่พบข้อผิดพลาดใดๆ ดังต่อไปนี้:
ขั้นตอน 3) เลือกวิชาทั้งหมดจากตารางดังนี้:
SELECT * FROM Subjects;
นี่จะให้รายชื่อวิชาแก่คุณ:
สังเกตว่าใส่แค่ 3 วิชาเท่านั้น”พีชคณิต หลักสูตรฐานข้อมูล และ Algorithms” แทนที่จะเป็น 4 แถว
แถวที่มีค่าที่ละเมิดข้อจำกัดคีย์หลักซึ่งก็คือ "โครงสร้างข้อมูล" จะถูกละเว้นและไม่ได้แทรก อย่างไรก็ตาม, SQLite ดำเนินการคำสั่งอื่นต่อไปหลังจากแถวนั้น
ขั้นตอน 4) ลบหัวเรื่องของตารางเพื่อสร้างใหม่อีกครั้งโดยใช้คำสั่ง ON CONFLICT ที่แตกต่างกันสำหรับตัวอย่างต่อไปนี้โดยรันคำสั่งต่อไปนี้:
DROP TABLE Subjects;
คำสั่ง drop จะลบทั้งตาราง หัวข้อตารางไม่มีอยู่ในขณะนี้
ตัวอย่างการแทนที่ความขัดแย้ง
ขั้นตอน 1) สร้างหัวข้อตารางใหม่ดังต่อไปนี้:
CREATE TABLE [Subjects] ( [SubjectId] INTEGER NOT NULL PRIMARY KEY ON CONFLICT REPLACE, [SubjectName] NVARCHAR NOT NULL );
โปรดสังเกตว่าเราได้กำหนดข้อจำกัดคีย์หลักในคอลัมน์ SubjectId ข้อจำกัดของคีย์หลักจะไม่อนุญาตให้แทรกค่าที่ซ้ำกันสองค่าลงในคอลัมน์ SubjectId เพื่อให้ค่าทั้งหมดในคอลัมน์นั้นไม่ซ้ำกัน
นอกจากนี้ โปรดสังเกตว่าเราเลือกตัวเลือกการแก้ไขข้อขัดแย้งเป็น “REPLACE- คำสั่งควรทำงานได้สำเร็จและคุณไม่ควรได้รับข้อผิดพลาดใดๆ:
ขั้นตอน 2) ตอนนี้ เรามาแทรกค่าบางค่าลงในตารางใหม่ Subjects แต่มีค่าที่ฝ่าฝืนข้อจำกัดของคีย์หลัก:
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');
ในคำสั่ง INSERT เหล่านี้ เราพยายามแทรกสองหลักสูตรที่มี Primary Key Subject id 2 เหมือนกัน ซึ่งเป็นการละเมิดข้อจำกัดของคีย์หลัก
คำสั่งควรทำงานได้ดีและคุณจะไม่พบข้อผิดพลาดใดๆ ดังต่อไปนี้:
ขั้นตอน 3) เลือกวิชาทั้งหมดจากตารางดังนี้:
SELECT * FROM Subjects;
นี่จะให้รายชื่อวิชาแก่คุณ:
สังเกตว่าใส่แค่ 3 วิชาเท่านั้น”พีชคณิต โครงสร้างข้อมูล และ Algorithms” ในขณะที่เราพยายามแทรก 4 แถว
แถวที่มีค่าที่ฝ่าฝืนข้อจำกัดของคีย์หลักซึ่งก็คือ “โครงสร้างข้อมูล” แทนที่ค่า “หลักสูตรฐานข้อมูล” ดังต่อไปนี้:
- คำสั่งแทรกสองคำสั่งแรกทำงานได้ดีโดยไม่มีปัญหา โดยจะแทรกวิชาพีชคณิต 1 วิชา และหลักสูตรฐานข้อมูลด้วยรหัส 2, XNUMX
- เมื่อ SQLite พยายามเรียกใช้คำสั่งแทรกที่สามด้วย SubjectId 2 และ SubjectName “โครงสร้างข้อมูล“ พบว่ามีหัวเรื่องที่มี SubjectId = 2 อยู่แล้ว ซึ่งเป็นการละเมิดข้อจำกัดคีย์หลักที่กำหนดไว้ในคอลัมน์ SubjectId
- SQLite จะเลือกความละเอียด REPLACE สำหรับข้อขัดแย้งนี้ โดยจะแทนที่ค่าที่มีอยู่แล้วในตารางหัวเรื่องด้วยค่าใหม่จากคำสั่ง insert ดังนั้น "หลักสูตรฐานข้อมูล” หัวเรื่องจะถูกแทนที่ด้วย “โครงสร้างข้อมูล” ชื่อหัวเรื่อง.
สรุป
ส่วนคำสั่ง INSERT, UPDATE และ DELETE ใช้เพื่อแก้ไขข้อมูลในไฟล์ SQLite ฐานข้อมูล- ส่วนคำสั่ง CONFLICT เป็นส่วนคำสั่งที่มีประสิทธิภาพในการแก้ไขข้อขัดแย้งระหว่างข้อมูลและข้อมูลที่จะแก้ไข