อัปเดตการประทับเวลาเมื่อมีการอัปเดตแถวใน PostgreSQL


87

ใน MySQL เราสามารถดำเนินการได้โดยที่อัปเดตคอลัมน์changetimestampทุกครั้งที่มีการเปลี่ยนแปลงแถว:

create table ab (
  id int, 
  changetimestamp timestamp 
    NOT NULL 
    default CURRENT_TIMESTAMP 
    on update CURRENT_TIMESTAMP 
);

มีสิ่งที่คล้ายกับการทำข้างต้นใน PostgreSQL หรือไม่?


afaik ไม่ใช่เรื่องง่ายใน PostgreSQL ที่คุณต้องการทริกเกอร์: pointbeing.net/weblog/2008/03/…
mechanical_meat

2
เป็นที่น่าสังเกตว่า MySQL มี "การรักษาพิเศษ" จำนวนหนึ่งสำหรับtimestampคอลัมน์ขึ้นอยู่กับรุ่นและการตั้งค่าซึ่ง (โชคดี!) ไม่สามารถทำซ้ำใน Postgres ได้ เช่นเดียวกับการอนุญาตให้0มีtimestampคอลัมน์หรือการเปลี่ยนNULLเป็นการประทับเวลาปัจจุบันเมื่อป้อนข้อมูลในกลุ่มดาวบางกลุ่ม ให้แน่ใจว่าได้ศึกษาคู่มือของทั้งสอง RDBMS ที่จะตระหนักถึงความแตกต่าง: MySQLและPostgres
Erwin Brandstetter

1
@ErwinBrandstetter คือคำตอบด้านล่างยังคงเป็นแนวทางปฏิบัติที่ดีที่สุดสำหรับการประทับเวลาอัตโนมัติในปี 2018
CommonSenseCode

คำตอบ:


127

สร้างฟังก์ชันที่อัพเดตคอลัมน์ changetimestamp ของตารางดังนี้:

CREATE OR REPLACE FUNCTION update_changetimestamp_column()
RETURNS TRIGGER AS $$
BEGIN
   NEW.changetimestamp = now(); 
   RETURN NEW;
END;
$$ language 'plpgsql';

สร้างทริกเกอร์บนตารางที่เรียกใช้ฟังก์ชัน update_changetimestamp_column () เมื่อใดก็ตามที่มีการอัปเดตเกิดขึ้นดังนี้:

    CREATE TRIGGER update_ab_changetimestamp BEFORE UPDATE
    ON ab FOR EACH ROW EXECUTE PROCEDURE 
    update_changetimestamp_column();

2
ดังนั้นไม่มีวิธีอื่นในการทำสิ่งที่ฉันต้องการยกเว้นผ่านทริกเกอร์? เนื่องจากฉันต้องการใช้ 'on update timestamp' สำหรับตารางทั้งหมดของฉันซึ่งอาจเป็น 300+ และฉันคิดว่าการสร้างทริกเกอร์อาจทำให้เกิดปัญหาด้านประสิทธิภาพ
bichonfrise74

5
เท่าที่ฉันรู้นี่เป็นวิธีมาตรฐานในการทำใน postgresql เมื่อคุณเขียน "on update current_timestamp" ใน mysql ระบบจะสร้างทริกเกอร์บนตารางในพื้นหลัง ความแตกต่างคือคุณกำลังเขียนทริกเกอร์ที่นี่ด้วยตนเองแทนที่จะเขียนให้คุณ
Charles Ma

3
ในทางปฏิบัติไม่มีการลงโทษ - อย่างน้อยก็ในฐานข้อมูลที่สมเหตุสมผล

5
มีวิธีตั้งชื่อคอลัมน์ที่ต้องอัพเดตเป็นพารามิเตอร์ให้กับฟังก์ชันupdate_changetimestamp_columnหรือไม่?
Antoan Milkov

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