SQLite แทรก อัปเดต ลบแบบสอบถามพร้อมตัวอย่าง

ส่วนการแก้ไขข้อมูลใน SQLite คือคำสั่ง INSERT, UPDATE และ DELETE ใช้สำหรับการแทรกแถวใหม่ อัปเดตค่าที่มีอยู่ หรือการลบแถวออกจากฐานข้อมูล

โปรดทราบว่าสำหรับตัวอย่างทั้งหมดต่อไปนี้ คุณต้องเรียกใช้ sqlite3.exe และเปิดการเชื่อมต่อกับฐานข้อมูลตัวอย่างแบบไหล:

ขั้นตอน 1) ในขั้นตอนนี้

  1. เปิด My Computer และไปที่ไดเร็กทอรีต่อไปนี้ “C:\sqlite"และ
  2. แล้วเปิด”sqlite3.exe"

SQLite แบบสอบถาม - แทรก อัปเดต ลบ

ขั้นตอน 2) เปิดฐานข้อมูล “บทช่วยสอนSampleDB.db” โดยคำสั่งต่อไปนี้:

.open TutorialsSampleDB.db

SQLite แบบสอบถาม - แทรก อัปเดต ลบ

ตอนนี้คุณพร้อมที่จะเรียกใช้แบบสอบถามประเภทใดก็ได้บนฐานข้อมูลแล้ว

SQLite INSERT

SQLite INSERT ใช้เพื่อแทรกบันทึกลงในตารางที่ระบุของฐานข้อมูล คุณต้องใช้ส่วนคำสั่ง 'INSERT' ไวยากรณ์ส่วนคำสั่ง INSERT เป็นดังนี้:

SQLite 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');

สิ่งนี้ควรจะทำงานได้สำเร็จและไม่มีเอาต์พุตสำหรับสิ่งนี้:

SQLite สิ่งที่ใส่เข้าไป

สิ่งนี้จะแทรกนักเรียนสองคน:

  • นักเรียนคนแรกที่มี 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 บันทึก

SQLite คำสั่ง UPDATE ใช้เพื่อแก้ไขระเบียนที่มีอยู่ในตาราง คุณสามารถใช้คำสั่ง WHERE กับคำสั่ง UPDATE เพื่ออัปเดตแถวที่เลือก คำสั่ง UPDATE จะอัปเดตตารางโดยเปลี่ยนค่าสำหรับคอลัมน์ที่ระบุ ต่อไปนี้คือไวยากรณ์ของคำสั่ง UPDATE:

SQLite บันทึก

ดังต่อไปนี้:

  • หลัง "ส่วนคำสั่งอัปเดต" คุณควรเขียนชื่อตารางที่จะอัปเดต
  • คุณต้องเขียน “SET clause” ซึ่งใช้สำหรับเขียนชื่อคอลัมน์ที่จะอัพเดตและค่าที่จะอัพเดต
  • คุณสามารถอัปเดตได้มากกว่าหนึ่งคอลัมน์ คุณสามารถใช้ลูกน้ำระหว่างแต่ละบรรทัดได้
  • คุณสามารถระบุส่วนคำสั่ง WHERE เพื่อระบุบางแถวเท่านั้น เฉพาะแถวที่นิพจน์ประเมินว่าเป็นจริงเท่านั้นที่จะได้รับการอัปเดต หากคุณไม่ได้ระบุส่วนคำสั่ง WHERE แถวทั้งหมดจะได้รับการอัปเดต

SQLite อัปเดตตัวอย่าง

ในคำสั่ง UPDATE ต่อไปนี้ เราจะอัปเดต DepartmentId สำหรับ Student ที่มี StudentId = 6 ให้เป็น 3:

UPDATE Students
SET DepartmentId = 3 
WHERE StudentId = 6;

สิ่งนี้ควรจะทำงานได้สำเร็จและคุณไม่ควรได้รับผลลัพธ์ใด ๆ :

SQLite บันทึก

ในส่วนคำสั่ง UPDATE เราระบุว่าเราต้องการอัปเดตตารางนักเรียน

  • ในส่วนคำสั่ง WHERE เราได้กรองนักเรียนทั้งหมดเพื่อเลือกเฉพาะแถวสำหรับ StudentId = 6
  • SET clause จะอัพเดทค่ารหัสแผนกสำหรับนักศึกษาที่เลือกเป็น 3

ตอนนี้เรามาตรวจสอบว่านักเรียนที่มี ID 6 ได้รับการอัปเดตหรือไม่โดยรันคำสั่งต่อไปนี้:

SELECT * FROM Students WHERE StudentId = 6;

ตอนนี้คุณน่าจะเห็นแล้วว่าค่า Department Id คือ 3 ดังต่อไปนี้:

SQLite บันทึก

SQLite ลบ

SQLite แบบสอบถาม DELETE ใช้เพื่อลบระเบียนที่มีอยู่ออกจากตารางที่ระบุ คุณสามารถใช้ส่วนคำสั่ง WHERE ร่วมกับคำสั่ง DELETE เพื่อลบแถวที่เลือกได้

คำสั่ง DELETE มีรูปแบบดังต่อไปนี้:

SQLite ลบ

  • คุณต้องเขียนชื่อตารางหลังส่วนคำสั่ง 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 จะถูกนำไปใช้กับทั้งสองและจะลบออกเท่านั้น

คำสั่งนี้ควรทำงานได้สำเร็จและคุณไม่ควรได้รับผลลัพธ์ใดๆ ดังต่อไปนี้:

SQLite ลบ

คุณสามารถตรวจสอบว่าลบนักเรียนทั้งสองคนแล้วหรือไม่ โดยเลือกรายการทั้งหมดจากตารางนักเรียนดังต่อไปนี้:

SELECT * FROM Students;

คุณไม่ควรเห็นนักเรียนสองคนที่มีรหัส 11 และ 12 ดังนี้:

SQLite ลบ

SQLite ข้อขัดแย้ง

สมมติว่าคุณมีคอลัมน์ที่มีข้อจำกัดคอลัมน์อย่างใดอย่างหนึ่งต่อไปนี้: UNIQUE, NOT NULL, CHECK หรือ PRIMARY KEY จากนั้นคุณพยายามแทรกหรืออัปเดตค่าในคอลัมน์นั้นด้วยค่าที่ขัดแย้งกับข้อจำกัดนี้

ตัวอย่างเช่น หากคอลัมน์มีข้อจำกัด UNIQUE และคุณพยายามแทรกค่าที่มีอยู่แล้ว (ค่าที่ซ้ำกัน) ซึ่งขัดแย้งกับข้อจำกัด UNIQUE จากนั้นส่วนคำสั่ง CONFLICT ให้คุณเลือกว่าจะทำอย่างไรในกรณีดังกล่าวเพื่อแก้ไขข้อขัดแย้งนี้

ก่อนที่เราจะอธิบายต่อไปว่าส่วนคำสั่ง CONFLICT แก้ไขข้อขัดแย้งได้อย่างไร คุณควรเข้าใจว่าธุรกรรมฐานข้อมูลคืออะไร

ธุรกรรมฐานข้อมูล

ธุรกรรมฐานข้อมูลระยะเป็นรายการของ SQLite การดำเนินการ (แทรก อัปเดต หรือลบ) ธุรกรรมฐานข้อมูลจะต้องดำเนินการเป็นหน่วยเดียว ซึ่งอาจดำเนินการทั้งหมดสำเร็จหรือไม่สำเร็จเลยก็ได้ การดำเนินการทั้งหมดจะถูกยกเลิกหากการดำเนินการใดการดำเนินการหนึ่งล้มเหลว

ตัวอย่างธุรกรรมฐานข้อมูล

การทำธุรกรรมโอนเงินจากบัญชีธนาคารหนึ่งไปยังอีกบัญชีหนึ่งนั้นจะมีขั้นตอนการดำเนินการหลายอย่าง การดำเนินการธุรกรรมนี้รวมถึงการถอนเงินจากบัญชีแรกและฝากเข้าในบัญชีอื่น ธุรกรรมนี้จะต้องเสร็จสมบูรณ์หรือยกเลิกอย่างสมบูรณ์และไม่ล้มเหลวระหว่างทาง

ต่อไปนี้เป็นรายการมติห้าประการที่คุณสามารถเลือกได้ในส่วนข้อขัดแย้ง:

  1. ย้อนกลับ – สิ่งนี้จะย้อนกลับการทำธุรกรรมในปัจจุบัน SQLite Statement ที่มีข้อขัดแย้ง (จะยกเลิกรายการทั้งหมด) ตัวอย่างเช่น หากคุณกำลังพยายามอัปเดต 10 แถว และแถวที่ 10 มีค่าที่ขัดแย้งกับข้อจำกัด จะไม่มีการอัปเดตแถว XNUMX แถวจะยังคงเหมือนเดิม จะเกิดข้อผิดพลาด
  2. ยกเลิก – สิ่งนี้จะยกเลิก (ยกเลิก) ปัจจุบัน SQLite เฉพาะใบแจ้งยอดที่มีข้อขัดแย้งและรายการจะไม่ถูกยกเลิก ตัวอย่างเช่น หากคุณกำลังพยายามอัปเดต 10 แถว และแถวที่ห้ามีค่าที่ขัดแย้งกับข้อจำกัด ระบบจะไม่อัปเดตเฉพาะค่าที่ห้า แต่อีก 9 แถวที่เหลือจะได้รับการอัปเดต จะเกิดข้อผิดพลาด
  3. ล้มเหลว - ยกเลิกกระแส SQLite คำกล่าวที่มีความขัดแย้ง อย่างไรก็ตาม ธุรกรรมจะไม่ดำเนินต่อไปแต่การเปลี่ยนแปลงก่อนหน้าที่ทำกับแถวก่อนหน้าแถวที่มีข้อขัดแย้งจะถูกคอมมิต ตัวอย่างเช่น หากคุณกำลังพยายามอัปเดต 10 แถว และแถวที่ห้ามีค่าที่ขัดแย้งกับข้อจำกัด จะมีเพียง 4 แถวเท่านั้นที่จะได้รับการอัปเดต และอีกแถวจะไม่อัปเดต จะเกิดข้อผิดพลาด
  1. ไม่สนใจ – การดำเนินการนี้จะข้ามแถวที่มีการละเมิดข้อจำกัดและดำเนินการประมวลผลแถวอื่นๆ ต่อไปของ SQLite คำแถลง. ตัวอย่างเช่น หากคุณกำลังพยายามอัปเดต 10 แถว และแถวที่ห้ามีค่าที่ขัดแย้งกับข้อจำกัด จะมีเพียง 4 แถวเท่านั้นที่จะได้รับการอัปเดต และอีกแถวจะไม่อัปเดต จะไม่ดำเนินการอัปเดตแถวอื่นๆ เพิ่มเติมและหยุดที่แถวที่มีค่าความขัดแย้ง จะไม่มีข้อผิดพลาดเกิดขึ้น
  1. REPLACE – ขึ้นอยู่กับประเภทของข้อจำกัดที่มีการละเมิด:
  • เมื่อมีการละเมิดข้อจำกัดสำหรับข้อจำกัด UNIQUE หรือ PRIMARY KEY REPLACE จะแทนที่แถวที่ทำให้เกิดการละเมิดด้วยแถวใหม่ที่แทรกหรืออัปเดต
  • เมื่อมีการละเมิดข้อจำกัด NOT NULL ส่วนคำสั่ง REPLACE จะแทนที่ค่า NULL ด้วยค่าเริ่มต้นของคอลัมน์นั้น หากคอลัมน์ไม่มีค่าเริ่มต้น SQLite จะยกเลิกใบแจ้งยอด (ใบแจ้งยอดจะถูกยกเลิก)
  • หากการละเมิดข้อจำกัด CHECK เกิดขึ้น ส่วนคำสั่งจะถูกยกเลิก

หมายเหตุ ความละเอียด 5 ข้อข้างต้นเป็นตัวเลือกว่าคุณต้องการแก้ไขข้อขัดแย้งอย่างไร อาจไม่จำเป็นว่าสิ่งที่สามารถนำมาใช้ในการแก้ไขข้อขัดแย้งประการหนึ่งสามารถนำไปใช้กับการแก้ไขข้อขัดแย้งประเภทอื่นได้

วิธีการประกาศส่วนคำสั่ง CONFLICT

คุณสามารถประกาศคำสั่ง ON CONFLICT ได้เมื่อคุณกำหนดข้อจำกัดสำหรับคำจำกัดความของคอลัมน์ภายในคำสั่ง CREATE TABLE โดยใช้รูปแบบต่อไปนี้:

SQLite ข้อขัดแย้ง

คุณสามารถเลือกหนึ่งข้อจากมติทั้งห้าข้อเพื่อแก้ไขข้อขัดแย้งตามที่อธิบายไว้ก่อนหน้านี้

ตัวอย่างการเพิกเฉยต่อความขัดแย้ง

ขั้นตอน 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 เป็นส่วนคำสั่งที่มีประสิทธิภาพในการแก้ไขข้อขัดแย้งระหว่างข้อมูลและข้อมูลที่จะแก้ไข