SQLite มุมมอง, ดัชนี และทริกเกอร์ พร้อมตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

SQLite มุมมอง (Views), ดัชนี (Indexes) และทริกเกอร์ (Triggers) เป็นเครื่องมือบริหารจัดการที่ทำให้การสืบค้นและบำรุงรักษาฐานข้อมูลง่ายขึ้น: มุมมองนำคำสั่งสืบค้นที่ซับซ้อนมาใช้ซ้ำ ดัชนีช่วยเพิ่มความเร็วในการค้นหา และทริกเกอร์จะเรียกใช้การกระทำที่กำหนดไว้ล่วงหน้าโดยอัตโนมัติทุกครั้งที่ข้อมูลเปลี่ยนแปลง

  • 🇧🇷 Views: วิว (View) คือตารางเชิงตรรกะที่สร้างขึ้นจากคำสั่ง SELECT ช่วยให้คุณสามารถนำคำสั่งค้นหาที่ซับซ้อนมาใช้ซ้ำได้โดยไม่ต้องเขียนใหม่ทั้งหมด
  • ⏳ มุมมองชั่วคราว: มุมมองชั่วคราวจะมีอยู่เฉพาะสำหรับการเชื่อมต่อปัจจุบันเท่านั้น และจะถูกลบโดยอัตโนมัติเมื่อการเชื่อมต่อสิ้นสุดลง
  • ⚡ ดัชนี: ดัชนีทำงานเหมือนดัชนีหนังสือ ช่วยให้... SQLite ค้นหาแถวที่ตรงกันได้อย่างรวดเร็ว แทนที่จะสแกนทุกแถวในตาราง
  • 🎯 ประเภทของดัชนี: SQLite รองรับการสร้างดัชนีแบบนิพจน์ ดัชนีแบบบางส่วน และดัชนีเฉพาะ เพื่อปรับแต่งประสิทธิภาพให้เหมาะสมกับรูปแบบการค้นหาเฉพาะ
  • 🔔 ทริกเกอร์: ทริกเกอร์จะเรียกใช้คำสั่งที่กำหนดไว้ล่วงหน้าโดยอัตโนมัติก่อนหรือหลังคำสั่ง INSERT, UPDATE หรือ DELETE บนตาราง
  • 🤖 ความช่วยเหลือจาก AI: เครื่องมือ AI แปลงข้อความเป็น SQL และ GitHub Copilot สร้าง SQLite มุมมอง ดัชนี และทริกเกอร์จากข้อความแจ้งเตือนที่เป็นภาษาอังกฤษธรรมดา

SQLite ทริกเกอร์ มุมมอง และดัชนี

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

SQLite รายละเอียด

มุมมองจะคล้ายกับตารางมาก แต่ Views นั้นเป็นตารางแบบลอจิคัล พวกเขาไม่ได้จัดเก็บทางกายภาพเหมือนตาราง มุมมองประกอบด้วยคำสั่ง Select

คุณสามารถกำหนดมุมมองสำหรับแบบสอบถามที่ซับซ้อนของคุณได้ และสามารถนำแบบสอบถามเหล่านี้กลับมาใช้ใหม่ได้ทุกเมื่อที่ต้องการ โดยการเรียกมุมมองโดยตรงแทนที่จะเขียนแบบสอบถามใหม่อีกครั้ง

สร้างคำสั่ง VIEW

เมื่อต้องการสร้างมุมมองบนฐานข้อมูล คุณสามารถใช้คำสั่ง CREATE VIEW ตามด้วยชื่อมุมมอง แล้วใส่แบบสอบถามที่คุณต้องการหลังจากนั้น

ตัวอย่าง: ในตัวอย่างต่อไปนี้ เราจะสร้างวิว (View) ที่ชื่อว่า “AllStudentsView” ในฐานข้อมูลตัวอย่าง “TutorialsSampleDB.db” ดังนี้:

ขั้นตอน 1) เปิด My Computer แล้วไปยังไดเร็กทอรีต่อไปนี้ “C:\sqlite” จากนั้นเปิด “sqlite3.exe”:

SQLite รายละเอียด

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

SQLite รายละเอียด

ขั้นตอน 3) ต่อไปนี้เป็นรูปแบบพื้นฐานของคำสั่ง sqlite3 เพื่อสร้างมุมมอง

CREATE VIEW AllStudentsView
AS
  SELECT 
    s.StudentId,
    s.StudentName,
    s.DateOfBirth,
    d.DepartmentName
FROM Students AS s
INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;

ไม่ควรมีเอาต์พุตจากคำสั่งดังนี้:

SQLite รายละเอียด

ขั้นตอน 4) เพื่อให้แน่ใจว่ามุมมองถูกสร้างขึ้น คุณสามารถเลือกจากรายการมุมมองในฐานข้อมูลได้โดยรันคำสั่งต่อไปนี้:

SELECT name FROM sqlite_master WHERE type = 'view';

คุณควรจะเห็นมุมมอง “AllStudentsView” ปรากฏขึ้น:

SQLite รายละเอียด

ขั้นตอน 5) ตอนนี้มุมมองของเราถูกสร้างขึ้นแล้ว คุณสามารถใช้มันเป็นตารางปกติได้ดังนี้:

SELECT * FROM AllStudentsView;

คำสั่งนี้จะสอบถามมุมมอง “AllStudents” และเลือกแถวทั้งหมดจากนั้นดังที่แสดงไว้ในภาพหน้าจอต่อไปนี้:

SQLite รายละเอียด

การดูชั่วคราว

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

  • สร้างมุมมองชั่วคราวหรือ
  • สร้างมุมมองชั่วคราว

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

ตัวอย่าง:

ในตัวอย่างต่อไปนี้ เราจะเปิดการเชื่อมต่อฐานข้อมูล จากนั้นสร้างมุมมองชั่วคราว

หลังจากนั้นเราจะปิดการเชื่อมต่อนั้น และเราจะตรวจสอบว่ามุมมองชั่วคราวยังคงมีอยู่หรือไม่

ขั้นตอน 1) เปิดไฟล์ sqlite3.exe จากไดเร็กทอรี “C:\sqlite” ตามที่อธิบายไว้ก่อนหน้านี้

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

.open TutorialsSampleDB.db

ขั้นตอน 3) เขียนคำสั่งต่อไปนี้เพื่อสร้างมุมมองชั่วคราวชื่อ “AllStudentsTempView” :

CREATE TEMP VIEW AllStudentsTempView
AS
  SELECT 
    s.StudentId,
    s.StudentName,
    s.DateOfBirth,
    d.DepartmentName
FROM Students AS s
INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;

SQLite รายละเอียด

ขั้นตอน 4) ตรวจสอบให้แน่ใจว่าได้สร้างมุมมองชั่วคราว “AllStudentsTempView” แล้ว โดยเรียกใช้คำสั่งต่อไปนี้:

SELECT name FROM sqlite_temp_master WHERE type = 'view';

SQLite รายละเอียด

ขั้นตอน 5) ปิด sqlite3.exe แล้วเปิดใหม่อีกครั้ง

ขั้นตอน 6) เปิดการเชื่อมต่อกับฐานข้อมูล “TutorialsSampleDB.db” โดยใช้คำสั่งต่อไปนี้:

.open TutorialsSampleDB.db

ขั้นตอน 7) รันคำสั่งต่อไปนี้เพื่อรับรายการมุมมองชั่วคราวที่สร้างขึ้นในฐานข้อมูล:

SELECT name FROM sqlite_temp_master WHERE type = 'view';

คุณไม่ควรเห็นผลลัพธ์ใดๆ เนื่องจากมุมมองชั่วคราวที่เราสร้างขึ้นจะถูกลบทิ้งเมื่อเราปิดการเชื่อมต่อฐานข้อมูลในขั้นตอนก่อนหน้า มิฉะนั้น ตราบใดที่คุณยังคงเชื่อมต่อกับฐานข้อมูลที่เปิดอยู่ คุณจะสามารถดูมุมมองชั่วคราวพร้อมข้อมูลได้

SQLite รายละเอียด

หมายเหตุ:

  • คุณไม่สามารถใช้คำสั่ง INSERT, DELETE หรือ UPDATE กับมุมมองได้ มีเพียงคุณเท่านั้นที่สามารถใช้คำสั่ง “select from views” ดังที่แสดงในขั้นตอนที่ 5 ในตัวอย่าง CREATE View
  • หากต้องการลบ VIEW คุณสามารถใช้คำสั่ง "DROP VIEW":
DROP VIEW AllStudentsView;

เพื่อให้แน่ใจว่ามุมมองถูกลบออก คุณสามารถรันคำสั่งต่อไปนี้ซึ่งจะแสดงรายการมุมมองในฐานข้อมูล:

SELECT name FROM sqlite_master WHERE type = 'view';

คุณจะไม่พบมุมมองใดๆ ที่ถูกส่งกลับมา เนื่องจากมุมมองถูกลบไปแล้ว ดังนี้:

SQLite รายละเอียด

นอกจากการนำคำสั่งค้นหาที่ซับซ้อนมาใช้ซ้ำด้วยมุมมองแล้ว SQLite นอกจากนี้ยังสามารถดึงข้อมูลแถวที่ตรงกันได้เร็วกว่าผ่านทางดัชนี

SQLite ดัชนี

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

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

ดัชนีใน SQLite (และแนวคิดเดียวกันนี้ใช้ได้กับสิ่งอื่น ระบบจัดการฐานข้อมูล เช่นกัน) ทำงานในลักษณะเดียวกับดัชนีที่พบในด้านหลังของหนังสือ

เมื่อคุณค้นหาแถวบางแถวใน SQLite ตารางที่มีเกณฑ์การค้นหา SQLite จะค้นหาทุกแถวของตารางจนกว่าจะพบแถวที่คุณกำลังมองหาที่ตรงกับเกณฑ์การค้นหา และกระบวนการนั้นจะช้ามากเมื่อคุณมีโต๊ะที่ใหญ่ขึ้น

ดัชนีจะเร่งการค้นหาข้อมูลและจะช่วยดึงข้อมูลจากตาราง ดัชนีถูกกำหนดไว้ในคอลัมน์ของตาราง

การปรับปรุงประสิทธิภาพด้วยดัชนี:

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

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

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

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

SQLite สร้างดัชนี

หากต้องการสร้างดัชนีบนคอลัมน์ คุณควรใช้คำสั่ง CREATE INDEX และคุณควรกำหนดไว้ดังนี้:

  • คุณต้องระบุชื่อของดัชนีหลังคำสั่ง CREATE INDEX
  • หลังชื่อของดัชนี คุณต้องใส่คีย์เวิร์ด “ON” ตามด้วยชื่อตารางที่จะสร้างดัชนี
  • จากนั้นรายการชื่อคอลัมน์ที่ใช้สำหรับดัชนี
  • คุณสามารถใช้คำสำคัญต่อไปนี้ “ASC” หรือ “DESC” หลังชื่อคอลัมน์ใดๆ เพื่อระบุลำดับการจัดเรียงที่ใช้ในการจัดลำดับข้อมูลดัชนี

ตัวอย่าง:

ในตัวอย่างต่อไปนี้ เราจะสร้างดัชนี “StudentNameIndex” บนตาราง students ในฐานข้อมูล “Students” ดังนี้:

ขั้นตอน 1) เข้าไปที่โฟลเดอร์ “C:\sqlite” ตามที่ได้อธิบายไว้ก่อนหน้านี้

ขั้นตอน 2) เปิด sqlite3.exe

ขั้นตอน 3) เปิดฐานข้อมูล “TutorialsSampleDB.db” โดยใช้คำสั่งต่อไปนี้:

.open TutorialsSampleDB.db

ขั้นตอน 4) สร้างดัชนีใหม่ชื่อ “StudentNameIndex” โดยใช้คำสั่งต่อไปนี้:

CREATE INDEX StudentNameIndex ON Students(StudentName);

คุณไม่ควรไม่เห็นผลลัพธ์สำหรับสิ่งนี้:

SQLite ดัชนี

ขั้นตอน 5) เพื่อให้แน่ใจว่าดัชนีถูกสร้างขึ้น คุณสามารถรันแบบสอบถามต่อไปนี้ ซึ่งจะแสดงรายการดัชนีที่สร้างขึ้นในตาราง Students:

PRAGMA index_list(Students);

คุณควรเห็นดัชนีที่เราเพิ่งสร้างกลับมา:

SQLite ดัชนี

หมายเหตุ:

  • ดัชนีสามารถสร้างขึ้นได้ไม่เพียงแต่ขึ้นอยู่กับคอลัมน์เท่านั้น แต่ขึ้นอยู่กับนิพจน์ด้วย บางสิ่งเช่นนี้:
CREATE INDEX OrderTotalIndex ON OrderItems(OrderId, Quantity*Price);

“OrderTotalIndex” จะขึ้นอยู่กับคอลัมน์ OrderId และการคูณของค่าคอลัมน์จำนวนและค่าคอลัมน์ราคาด้วย ดังนั้นการสืบค้นใดๆ สำหรับ "OrderId" และ "Quantity*Price" จะมีประสิทธิภาพเนื่องจากการสืบค้นจะใช้ดัชนี

  • หากคุณระบุคำสั่ง WHERE ในคำสั่ง CREATE INDEX ดัชนีจะเป็นดัชนีบางส่วน ในกรณีนี้ จะมีรายการในดัชนีสำหรับแถวที่ตรงกับเงื่อนไขในคำสั่ง WHERE เท่านั้น ตัวอย่างเช่น ในดัชนีต่อไปนี้:
    CREATE INDEX OrderTotalIndexForLargeQuantities ON OrderItems(OrderId, Quantity*Price)
    WHERE Quantity > 10000;

    ( ในตัวอย่างข้างต้น ดัชนีจะเป็นดัชนีบางส่วนเนื่องจากมีการระบุส่วนคำสั่ง WHERE ไว้ ในกรณีนี้ ดัชนีจะถูกนำไปใช้กับคำสั่งซื้อที่มีมูลค่าปริมาณมากกว่า 10000 เท่านั้น โปรดทราบว่าดัชนีนี้เรียกว่าดัชนีบางส่วน เนื่องจากส่วนคำสั่ง WHERE ไม่ใช่นิพจน์ที่ใช้ อย่างไรก็ตาม คุณสามารถใช้นิพจน์กับดัชนีปกติได้)

  • คุณสามารถใช้คำสั่ง CREATE UNIQUE INDEX แทน CREATE INDEX เพื่อป้องกันรายการที่ซ้ำกันสำหรับคอลัมน์ ดังนั้นค่าทั้งหมดสำหรับคอลัมน์ที่จัดทำดัชนีจะไม่ซ้ำกัน
  • หากต้องการลบดัชนี ให้ใช้คำสั่ง DROP INDEX ตามด้วยชื่อดัชนีที่ต้องการลบ

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

SQLite ทริกเกอร์

รู้เบื้องต้นเกี่ยวกับ SQLite ทริกเกอร์

ทริกเกอร์คือการดำเนินการที่กำหนดไว้ล่วงหน้าโดยอัตโนมัติซึ่งจะดำเนินการเมื่อมีการดำเนินการเฉพาะเจาะจงเกิดขึ้นบนตารางฐานข้อมูล ทริกเกอร์สามารถกำหนดให้ทำงานเมื่อใดก็ตามที่มีการดำเนินการต่อไปนี้เกิดขึ้นบนตาราง:

  • INSERT ลงในตาราง
  • ลบแถวออกจากตาราง
  • อัปเดตหนึ่งในคอลัมน์ของตาราง

SQLite รองรับทริกเกอร์ FOR EACH ROW เพื่อให้การดำเนินการที่กำหนดไว้ล่วงหน้าในทริกเกอร์จะถูกดำเนินการกับแถวทั้งหมดที่เกี่ยวข้องกับการดำเนินการที่เกิดขึ้นในตาราง (ไม่ว่าจะเป็นการแทรก ลบ หรืออัปเดต)

SQLite สร้างทริกเกอร์

ในการสร้าง TRIGGER ใหม่ คุณสามารถใช้คำสั่ง CREATE TRIGGER ได้ดังต่อไปนี้:

  • หลังจาก CREATE TRIGGER คุณควรระบุชื่อทริกเกอร์
  • หลังจากชื่อทริกเกอร์ คุณต้องระบุว่าควรใช้ชื่อทริกเกอร์เมื่อใด คุณมีสามทางเลือก:
    • ก่อน – ทริกเกอร์จะถูกดำเนินการก่อนคำสั่ง INSERT, UPDATE หรือคำสั่งลบที่ระบุ
    • After – ทริกเกอร์จะถูกดำเนินการหลังจาก INSERT, UPDATE หรือคำสั่งลบที่ระบุ
    • แทน - มันจะแทนที่การกระทำที่เกิดขึ้นซึ่งทริกเกอร์ด้วยคำสั่งที่ระบุใน TRIGGER ทริกเกอร์ INSTEAD OF ไม่สามารถใช้ได้กับตาราง เฉพาะกับมุมมองเท่านั้น
  • จากนั้น คุณต้องระบุประเภทของการกระทำ ทริกเกอร์จะเริ่มทำงานเมื่อมันเกิดขึ้น ลบ แทรก หรืออัปเดต
  • คุณสามารถเลือกชื่อคอลัมน์ที่ไม่บังคับเพื่อให้ทริกเกอร์ไม่เริ่มทำงาน เว้นแต่ว่าจะมีการดำเนินการกับคอลัมน์นั้น
  • จากนั้นคุณต้องระบุชื่อตารางที่จะสร้างทริกเกอร์
  • ภายในเนื้อหาของทริกเกอร์ คุณควรระบุคำสั่งที่ควรดำเนินการสำหรับแต่ละแถวเมื่อทริกเกอร์เริ่มทำงาน

ทริกเกอร์จะถูกเปิดใช้งาน (เริ่มทำงาน) ขึ้นอยู่กับประเภทของคำสั่งที่ระบุในคำสั่งสร้างทริกเกอร์เท่านั้น ตัวอย่างเช่น:

  • ทริกเกอร์ BEFORE INSERT จะถูกเปิดใช้งาน (เริ่มทำงาน) ก่อนคำสั่งแทรกใด ๆ
  • ทริกเกอร์ AFTER UPDATE จะถูกเปิดใช้งาน (เริ่มทำงาน) หลังจากคำสั่งอัพเดตใดๆ ... และอื่นๆ

ภายในทริกเกอร์ คุณสามารถอ้างถึงค่าที่เพิ่มเข้ามาใหม่ได้โดยใช้คีย์เวิร์ด “ใหม่” นอกจากนี้ คุณยังสามารถอ้างถึงค่าที่ถูกลบหรืออัปเดตได้โดยใช้คีย์เวิร์ดเก่า ดังต่อไปนี้:

  • ทริกเกอร์ภายใน INSERT - สามารถใช้คำหลักใหม่ได้
  • ภายในทริกเกอร์ UPDATE - สามารถใช้คำหลักใหม่และเก่าได้
  • ภายในทริกเกอร์ DELETE - สามารถใช้คำหลักเก่าได้

ตัวอย่าง

ต่อไปนี้ เราจะสร้างทริกเกอร์ที่จะทำงานก่อนที่จะเพิ่มนักเรียนใหม่ลงในตาราง "นักเรียน"

ระบบจะบันทึกข้อมูลนักเรียนที่เพิ่มเข้ามาใหม่ลงในตาราง “StudentsLog” พร้อมประทับเวลาอัตโนมัติสำหรับวันที่และเวลาปัจจุบันที่คำสั่งเพิ่มข้อมูลเกิดขึ้น ดังนี้:

ขั้นตอน 1) ไปที่ไดเร็กทอรี “C:\sqlite” แล้วเรียกใช้ไฟล์ sqlite3.exe

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

.open TutorialsSampleDB.db

ขั้นตอน 3) สร้างทริกเกอร์ “InsertIntoStudentTrigger” โดยเรียกใช้คำสั่งต่อไปนี้:

CREATE TRIGGER InsertIntoStudentTrigger 
       BEFORE INSERT ON Students
BEGIN
  INSERT INTO StudentsLog VALUES(new.StudentId, datetime(), 'Insert');
END;

ฟังก์ชัน “datetime()” จะให้ค่าเวลาปัจจุบันขณะที่คำสั่งแทรกข้อมูลเกิดขึ้น เพื่อให้เราสามารถบันทึกธุรกรรมการแทรกข้อมูลพร้อมเพิ่มเวลาอัตโนมัติลงในแต่ละธุรกรรมได้

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

SQLite ทริกเกอร์

ทริกเกอร์ “InsertIntoStudentTrigger” จะทำงานทุกครั้งที่คุณแทรกนักเรียนใหม่ลงในตารางนักเรียน คำว่า “new” หมายถึงค่าที่จะถูกแทรก ตัวอย่างเช่น “new.StudentId” คือรหัสประจำตัวนักเรียนที่จะถูกแทรก

ตอนนี้ เราจะทดสอบว่าทริกเกอร์ทำงานอย่างไรเมื่อเราแทรกนักเรียนใหม่

ขั้นตอน 4) เขียนคำสั่งต่อไปนี้เพื่อแทรกนักเรียนใหม่ลงในตารางนักเรียน:

INSERT INTO Students VALUES(11, 'guru11', 1, '1999-10-12');

ขั้นตอน 5) เขียนคำสั่งต่อไปนี้เพื่อเลือกทุกแถวจากตาราง “StudentsLog”:

SELECT * FROM StudentsLog;

คุณควรเห็นแถวใหม่สำหรับนักเรียนใหม่ที่เราเพิ่งแทรก:

SQLite ทริกเกอร์

แถวนี้ถูกแทรกโดยทริกเกอร์ก่อนที่จะแทรกนักเรียนใหม่ด้วยรหัส 11

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

การป้องกันการอัปเดตโดยไม่ได้ตั้งใจด้วยทริกเกอร์:

การใช้ทริกเกอร์ BEFORE UPDATE บนตาราง คุณสามารถป้องกันคำสั่งอัพเดตในคอลัมน์ตามนิพจน์ได้

ตัวอย่าง

ในตัวอย่างต่อไปนี้ เราจะป้องกันไม่ให้คำสั่งอัปเดตใดๆ อัปเดตคอลัมน์ “studentname” ในตาราง Students:

ขั้นตอน 1) ไปที่ไดเร็กทอรี “C:\sqlite” แล้วเรียกใช้ไฟล์ sqlite3.exe

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

.open TutorialsSampleDB.db

ขั้นตอน 3) สร้างทริกเกอร์ใหม่ชื่อ “preventUpdateStudentName” บนตาราง “Students” โดยเรียกใช้คำสั่งต่อไปนี้

CREATE TRIGGER preventUpdateStudentName
BEFORE UPDATE OF StudentName ON Students
FOR EACH ROW
BEGIN
    SELECT RAISE(ABORT, 'You cannot update studentname');
END;

คำสั่ง “RAISE” จะทำให้เกิดข้อผิดพลาดพร้อมข้อความแสดงข้อผิดพลาดว่า “คุณไม่สามารถอัปเดต studentname ได้” จากนั้นจะป้องกันไม่ให้คำสั่งอัปเดตทำงาน

ตอนนี้ เราจะตรวจสอบว่าทริกเกอร์ทำงานได้ดี และจะป้องกันการอัปเดตใดๆ สำหรับคอลัมน์ชื่อนักเรียน

ขั้นตอน 4) เรียกใช้คำสั่งอัปเดตต่อไปนี้ ซึ่งจะอัปเดตชื่อนักเรียน "Jack" เป็น "Jack1"

UPDATE Students SET StudentName = 'Jack1' WHERE StudentName = 'Jack';

คุณควรได้รับข้อความแสดงข้อผิดพลาดที่เรากำหนดไว้ในทริกเกอร์ ซึ่งระบุว่า “คุณไม่สามารถอัปเดตชื่อนักเรียนได้” ดังต่อไปนี้:

SQLite ทริกเกอร์

ขั้นตอน 5) รันคำสั่งต่อไปนี้ซึ่งจะเลือกรายชื่อนักเรียนจากตารางนักเรียน

SELECT StudentName FROM Students;

คุณจะเห็นว่าชื่อนักเรียน “แจ็ค” ยังคงเหมือนเดิมและไม่เปลี่ยนแปลง:

SQLite ทริกเกอร์

คำถามที่พบบ่อย

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

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

สร้างดัชนีบนคอลัมน์ที่ใช้บ่อยในเงื่อนไข WHERE, JOIN หรือ ORDER BY โดยเฉพาะคอลัมน์ที่มีค่าซ้ำกันมากและมีจำนวนน้อย ดัชนีช่วยเพิ่มความเร็วในการค้นหาด้วยคำสั่ง SELECT แต่การเพิ่มดัชนีลงในตารางที่ค้นหาน้อยหรือตารางขนาดเล็กมากจะให้ประโยชน์เพียงเล็กน้อย

ใช่แล้ว ดัชนีทุกตัวจะต้องได้รับการอัปเดตทุกครั้งที่มีการเปลี่ยนแปลงแถว ดังนั้นดัชนีเพิ่มเติมแต่ละตัวจะเพิ่มภาระการเขียนและพื้นที่จัดเก็บข้อมูล ควรสร้างดัชนีเฉพาะคอลัมน์ที่คุณค้นหาบ่อย แต่ควรหลีกเลี่ยงการสร้างดัชนีมากเกินไปในตารางที่มีการรับส่งข้อมูล INSERT, UPDATE หรือ DELETE จำนวนมาก

ลำดับ SQLite ไม่มีคำสั่ง CREATE MATERIALIZED VIEW และวิวทั่วไปจะไม่แคชผลลัพธ์ หากต้องการจำลองการทำงานดังกล่าว ให้สร้างตารางจริงและซิงโครไนซ์ข้อมูลโดยใช้ทริกเกอร์ AFTER INSERT, UPDATE และ DELETE บนตารางต้นทาง

sqlite_master คือแคตตาล็อกสคีมาในตัวที่แสดงรายการตาราง มุมมอง ดัชนี และทริกเกอร์ทั้งหมดในฐานข้อมูล คุณสามารถเรียกดูข้อมูลจากแคตตาล็อกนี้ได้ เช่น SELECT name FROM sqlite_master WHERE type = 'view'; เพื่อตรวจสอบว่ามีอ็อบเจ็กต์ใดบ้าง

ใช่แล้ว ระบบ AI แปลงข้อความเป็นคำสั่ง SQL จะแปลงคำขอภาษาอังกฤษธรรมดาให้เป็นข้อความธรรมดา SQLite คำสั่ง CREATE VIEW, CREATE INDEX และ CREATE TRIGGER การระบุชื่อตารางและชื่อคอลัมน์ที่ถูกต้องจะช่วยเพิ่มความแม่นยำ และควรตรวจสอบและทดสอบคำสั่งที่สร้างขึ้นทุกคำสั่งก่อนนำไปใช้กับข้อมูลจริง

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

สรุปโพสต์นี้ด้วย: