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

ใช้ทริกเกอร์เพื่อหยุดการแทรกหรืออัปเดตใน MySQL หรือไม่


คุณต้องใช้คำสั่ง SIGNAL SQL STATE เพื่อหยุดการแทรกหรืออัปเดตใน MySQL ไวยากรณ์ทริกเกอร์มีดังนี้:

DELIMITER // CREATE TRIGGER yourTriggerName ก่อน INSERT ON yourTableName FOR EACH ROWBEGINyourCondition THENSIGNAL SQLSTATE '45000'SET MESSAGE_TEXT ='anyMessageToEndUser';END //DELIMITER;

ตอนนี้ สร้างทริกเกอร์ที่จะป้องกันไม่ให้แทรกระเบียนในตารางในบางเงื่อนไข แบบสอบถามเพื่อสร้างทริกเกอร์มีดังนี้:

mysql> DELIMITER //mysql> สร้าง TRIGGER InsertPreventTrigger ก่อน INSERT ON Insert_Prevent -> สำหรับแต่ละแถว -> BEGIN -> IF (new.Id <1 หรือ new.Id> 5) จากนั้น -> สัญญาณ SQLSTATE '45000' -> SET MESSAGE_TEXT ='คุณไม่สามารถแทรกบันทึก'; -> สิ้นสุดถ้า; -> END //แบบสอบถามตกลง 0 แถวได้รับผลกระทบ (0.20 วินาที) mysql> DELIMITER;

ทริกเกอร์ด้านบนจะหยุดแทรกทุกครั้งที่คุณแทรกระเบียนที่น้อยกว่า 0 หรือมากกว่า 5

ให้เราสร้างตารางก่อน แบบสอบถามเพื่อสร้างตารางมีดังนี้:

mysql> สร้างตาราง Insert_Prevent -> ( -> Id int -> ); ตกลง ตกลง 0 แถวได้รับผลกระทบ (0.62 วินาที)

ตอนนี้แทรกเรกคอร์ดที่น้อยกว่า 0 หรือมากกว่า 5 ซึ่งจะส่งผลให้เกิดข้อความแสดงข้อผิดพลาดเนื่องจากทริกเกอร์ถูกสร้างขึ้นเพื่อหยุดการแทรกเมื่อใดก็ตามที่คุณแทรกเรกคอร์ดที่น้อยกว่า 0 หรือมากกว่า 5 ข้อความแสดงข้อผิดพลาดมีดังนี้:

mysql> แทรกลงใน Insert_Prevent values(0);ERROR 1644 (45000):คุณไม่สามารถแทรก recordmysql> ลงในค่า Insert_Prevent(6);ERROR 1644 (45000):คุณไม่สามารถแทรกเรคคอร์ด

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

mysql> แทรกลงในค่า Insert_Prevent (1); แบบสอบถามตกลง 1 แถวได้รับผลกระทบ (0.20 วินาที) mysql> แทรกลงในค่า Insert_Prevent (5) แบบสอบถามตกลง 1 แถวได้รับผลกระทบ (0.17 วินาที) mysql> แทรกลงในค่า Insert_Prevent ( 2); แบบสอบถามตกลง 1 แถวได้รับผลกระทบ (0.11 วินาที) mysql> แทรกลงในค่า Insert_Prevent (3) แบบสอบถามตกลง 1 แถวได้รับผลกระทบ (0.23 วินาที)

แสดงระเบียนทั้งหมดจากตารางโดยใช้คำสั่ง select แบบสอบถามมีดังนี้:

mysql> เลือก *จาก Insert_Prevent;

ต่อไปนี้เป็นผลลัพธ์:

<ก่อนหน้า>+------+| รหัส |+------+| 1 || 5 || 2 || 3 |+------+4 แถวในชุด (0.00 วินาที)