จะเช็คอินทริกเกอร์ได้อย่างไรถ้าทั้งแถวยังคงเหมือนเดิมหลังจากอัพเดท?


11

แน่นอนฉันสามารถทำได้สำหรับทุกคอลัมน์เปรียบเทียบเช่นนี้

if (old.column1 = new.column1 and old.column2 = new.column2...)

แต่มันจะยากรหัส b และยากที่จะรักษาถ้าฉันเพิ่มคอลัมน์อื่นในอนาคตเช่น

มีวิธีการตรวจสอบว่าคอลัมน์ทั้งหมดยังคงเหมือนเดิมหรือไม่โดยไม่ตรวจสอบทุกคอลัมน์ด้วยตนเอง?



ขออภัย แต่ยกเว้นว่าจะใช้ในกรณีของฉันได้อย่างไร ฉันพยายามที่จะเปรียบเทียบแถวเก่ากับค่าแถวใหม่จากสิ่งที่ฉันรู้ยกเว้นว่าจะใช้ในการเปรียบเทียบแถวที่มีอยู่จากสองแบบสอบถามไม่ได้อยู่ในบริบทเก่า / ใหม่ของทริกเกอร์ ...
Mateus Viccari

ฉันไม่คุ้นเคยกับ dbms ของคุณ - มีวิธีเลือกใหม่ * ยกเว้นเลือกเก่า *? หาก rowcount = 0 จะไม่มีการเปลี่ยนแปลงแถว
Scott Hodgin

คำตอบ:


15

คุณสามารถเปรียบเทียบoldและnewระเบียนที่ใช้is not distinct fromซึ่งจัดการค่า NULL ได้อย่างถูกต้อง (หากคอลัมน์ทั้งหมดถูกกำหนดเป็น NOT NULL คุณสามารถใช้=หรือ<>)

if old is not distinct from new then 
   .... do something
end if;

สามารถทำเช่นเดียวกันเพื่อตรวจสอบว่ามีการเปลี่ยนแปลงอย่างน้อยหนึ่งคอลัมน์หรือไม่:

if old is distinct from new then 
   .... do something
end if;

NULL จัดการกับเงื่อนไขเหล่านี้อย่างไร
ypercubeᵀᴹ

@ ypercubeᵀᴹ: จุดดี ฉันปรับปรุงคำตอบของฉัน
a_horse_with_no_name

ขอบคุณ ฉันทำการตรวจสอบอย่างรวดเร็วและดูเหมือนว่าold=newจะจัดการกับเคสได้เหมือนold is not distinct from oldกัน กล่าวอีกนัยหนึ่งฉันไม่สามารถหากรณีที่old=newให้ผลเป็นศูนย์ ฉันไม่ได้คาดหวังอย่างนั้น!
ypercubeᵀᴹ

ฉันคิดว่าจะต่างกันold <> newแต่ฉันก็ไม่แน่ใจ
a_horse_with_no_name
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.