Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

มุมมอง MySQL ที่ไม่สอดคล้องกันในที่ใด และเราจะมั่นใจได้อย่างไรว่ามีความสอดคล้องกัน


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

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

ไวยากรณ์

สร้างหรือแทนที่ VIEW view_name AS Select_statement WITH CHECK OPTION;

ตัวอย่าง

เพื่อแสดงแนวคิดข้างต้น เราใช้ข้อมูลต่อไปนี้จากตาราง ‘Student_info’ –

mysql> เลือก * จาก student_info;+------+---------+------------+--------- ----+| id | ชื่อ | ที่อยู่ | เรื่อง |+------+---------+-----------+-----------+| 101 | YashPal | อมฤตสาร์ | ประวัติศาสตร์ || 105 | Gaurav | จัณฑีครห์ | วรรณกรรม || 125 | รามัน | ชิมลา | คอมพิวเตอร์ || 130 | ราม | เจฮานซี่ | คอมพิวเตอร์ |+------+---------+-----------+-----------+4 แถวในชุด (0.08 วินาที)

ตอนนี้ ด้วยความช่วยเหลือของแบบสอบถามต่อไปนี้ เราจะสร้างชื่อมุมมอง 'ข้อมูล' เราไม่ได้ใช้ WITH CHECK OPTION

mysql> สร้างหรือแทนที่ VIEW Info AS Select Id, Name, Address, Subject จาก student_info โดยที่ Subject ='Computers';Query OK, 0 แถวที่ได้รับผลกระทบ (0.46 วินาที)mysql> เลือก * จากข้อมูล;+---- ---+------+---------+-----------+| รหัส | ชื่อ | ที่อยู่ | เรื่อง |+------+-------+---------+-----------+| 125 | รามัน | ชิมลา | คอมพิวเตอร์ || 130 | ราม | เจฮานซี่ | คอมพิวเตอร์ |+------+-------+---------+-----------+2 แถวในชุด (0.00 วินาที) 

เนื่องจากเราไม่ได้ใช้ WITH CHECK OPTION ดังนั้นเราจึงสามารถแทรก/อัปเดตแถวใหม่ใน 'Info' แม้ว่าจะไม่ตรงกับคำจำกัดความก็ตาม มันแสดงให้เห็นในแบบสอบถามต่อไปนี้และผลลัพธ์ของมัน -

mysql> INSERT INTO Info (Id, Name, Address, Subject) ค่า (132, 'Shyam',' Chandigarh', 'Economics');Query OK, 1 แถวได้รับผลกระทบ (0.37 วินาที)mysql> เลือก * จาก student_info;+------+---------+-----------+-----------+| id | ชื่อ | ที่อยู่ | เรื่อง |+------+---------+-----------+-----------+| 101 | YashPal | อมฤตสาร์ | ประวัติศาสตร์ || 105 | Gaurav | จัณฑีครห์ | วรรณกรรม || 125 | รามัน | ชิมลา | คอมพิวเตอร์ || 130 | ราม | เจฮานซี่ | คอมพิวเตอร์ || 132 | Shyam | จัณฑีครห์ | เศรษฐศาสตร์ |+------+---------+-----------+-----------+5 แถวในชุด (0.00 วินาที) mysql> เลือก * จากข้อมูล;+------+-------+---------+-----------+| รหัส | ชื่อ | ที่อยู่ | เรื่อง |+------+-------+---------+-----------+| 125 | รามัน | ชิมลา | คอมพิวเตอร์ || 130 | ราม | เจฮานซี่ | คอมพิวเตอร์ |+------+-------+---------+-----------+2 แถวในชุด (0.00 วินาที) 

ชุดผลลัพธ์ข้างต้นแสดงว่าแถวใหม่ไม่ตรงกับคำจำกัดความของ 'ข้อมูล' จึงไม่ปรากฏในมุมมอง ในแบบสอบถามต่อไปนี้ เรากำลังสร้างมุมมองเดียวกัน 'ข้อมูล'

โดยใช้ 'พร้อมตรวจสอบตัวเลือก' -

mysql> สร้างหรือแทนที่ VIEW Info AS Select Id, Name, Address, Subject จาก student_info โดยที่ Subject ='Computers' WITH CHECK OPTION; Query OK, 0 แถวได้รับผลกระทบ (0.06 วินาที)

ตอนนี้ หากเราจะพยายามแทรกแถวที่ตรงกับคำจำกัดความของมุมมอง 'ข้อมูล' MySQL อนุญาตให้เราทำได้ สามารถล้างออกจากข้อความค้นหาต่อไปนี้และผลลัพธ์ได้

mysql> INSERT INTO Info (Id, Name, Address, Subject) ค่า (133, 'Mohan','Delhi','Computers');Query OK, 1 แถวที่ได้รับผลกระทบ (0.07 วินาที)mysql> เลือก * จากข้อมูล;+------+-------+---------+-----------+| รหัส | ชื่อ | ที่อยู่ | เรื่อง |+------+-------+---------+-----------+| 125 | รามัน | ชิมลา | คอมพิวเตอร์ || 130 | ราม | เจฮานซี่ | คอมพิวเตอร์ || 133 | โมฮัน | เดลี | คอมพิวเตอร์ |+------+-------+---------+-----------+3 แถวในชุด (0.00 วินาที) 

แต่สมมติว่าถ้าเราจะพยายามแทรกแถวที่ไม่ตรงกับคำจำกัดความของมุมมอง 'ข้อมูล' MySQL จะไม่อนุญาตให้เราทำและแสดงข้อผิดพลาด -

mysql> INSERT INTO Info (Id, Name, Address, Subject) ค่า (134, 'Charanjeet','Amritsar','Geophysics');ข้อผิดพลาด 1369 (HY000):CHECK OPTION ล้มเหลว