PostgreSQL: ไม่เปลี่ยนรูปเปลี่ยนแปลงได้เสถียร
ฉันไม่ชัดเจนเกี่ยวกับความหมายที่แท้จริงในคำจำกัดความของฟังก์ชัน IMMUTABLE, VOLATILE และ STABLE ฉันอ่านเอกสารโดยเฉพาะคำจำกัดความของแต่ละคำ เปลี่ยนรูปแสดงให้เห็นว่าฟังก์ชั่นไม่สามารถแก้ไขฐานข้อมูลและ เสมอกลับผลเดียวกันเมื่อได้รับค่าอาร์กิวเมนต์เดียวกัน ; นั่นคือมันไม่ทำการค้นหาฐานข้อมูลหรือใช้ข้อมูลที่ไม่ได้อยู่ในรายการอาร์กิวเมนต์โดยตรง หากมีการกำหนดตัวเลือกนี้การเรียกฟังก์ชันใด ๆ ที่มีอาร์กิวเมนต์คงที่ทั้งหมดสามารถแทนที่ด้วยค่าฟังก์ชันได้ทันที STABLE บ่งชี้ว่าฟังก์ชั่นไม่สามารถแก้ไขฐานข้อมูลและภายในการสแกนตารางเดียวมันจะส่งคืนผลลัพธ์เดียวกันสำหรับค่าอาร์กิวเมนต์เดียวกันแต่ผลลัพธ์นั้นสามารถเปลี่ยนแปลงได้ตลอดทั้งคำสั่ง SQL นี่คือการเลือกที่เหมาะสมสำหรับฟังก์ชั่นที่ผลลัพธ์ขึ้นอยู่กับการค้นหาฐานข้อมูลตัวแปรพารามิเตอร์ (เช่นเขตเวลาปัจจุบัน) ฯลฯ (ไม่เหมาะสมสำหรับทริกเกอร์ AFTER ที่ต้องการแถวการสืบค้นที่แก้ไขโดยคำสั่งปัจจุบัน) โปรดทราบว่า ฟังก์ชันตระกูล current_timestamp มีคุณสมบัติว่าเสถียรเนื่องจากค่าของมันไม่เปลี่ยนแปลงภายในธุรกรรม VOLATILE บ่งชี้ว่าค่าฟังก์ชั่นสามารถเปลี่ยนแปลงได้แม้ในการสแกนตารางเดียวดังนั้นจึงไม่มีการปรับให้เหมาะสม ฟังก์ชันฐานข้อมูลค่อนข้างน้อยมีความผันผวนในแง่นี้ ตัวอย่างบางส่วนเป็นแบบสุ่ม (), currval (), timeofday () แต่โปรดทราบว่าฟังก์ชั่นใด ๆ ที่มีผลข้างเคียงจะต้องจำแนกความผันผวนแม้ว่าผลที่ได้นั้นจะสามารถคาดเดาได้อย่างชัดเจนเพื่อป้องกันการโทรออก ตัวอย่างคือ setval () ความสับสนของฉันมาพร้อมกับเงื่อนไขสำหรับ IMMUTABLE และเสถียรที่ฟังก์ชันALWAYSหรือCONSISTENTLYส่งคืนผลลัพธ์เดียวกันโดยให้อาร์กิวเมนต์เดียวกัน นิยาม IMMUTABLE ระบุว่าฟังก์ชันไม่ได้ทำการค้นหาฐานข้อมูลหรือใช้ข้อมูลที่ไม่ได้นำเสนอโดยตรงในรายการอาร์กิวเมนต์ ดังนั้นสำหรับฉันนั่นหมายถึงฟังก์ชั่นดังกล่าวถูกใช้เพื่อจัดการข้อมูลที่ได้รับจากลูกค้าและไม่ควรมีคำสั่ง SELECT ... …