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