PostgreSQL'de satır güncellendiğinde zaman damgasını güncelle


87

MySQL'de bunu changetimestamp, satır her değiştirildiğinde sütunu güncellediği yerde yürütebiliriz :

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

Yukarıdakilere PostgreSQL'de benzer bir şey var mı?


afaik değil PostgreSQL kolay gibi bir tetikleyici gereken yere: pointbeing.net/weblog/2008/03/...
mechanical_meat

2
MySQL'in timestampsürüm ve ayarlara bağlı olarak (neyse ki!) Postgres'te çoğaltılamayan sütunlar için bir dizi "özel işlemlere" sahip olduğunu belirtmek gerekir. 0Bir timestampsütuna izin vermek veya NULLbelirli takımyıldızlarda girişte geçerli zaman damgasına dönüştürmek gibi . İnce farklılıkların farkında olmak için her iki RDBMS'nin kılavuzunu incelediğinizden emin olun: MySQL ve Postgres .
Erwin Brandstetter

1
@ErwinBrandstetter, aşağıda verilen cevap 2018'deki zaman damgalarını otomatik güncellemek için hala en iyi uygulama mı?
CommonSenseCode

Yanıtlar:


127

Bir tablonun değişim damgası sütununu şu şekilde güncelleyen bir işlev oluşturun:

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

Tabloda, aşağıdaki gibi bir güncelleme olduğunda update_changetimestamp_column () işlevini çağıran bir tetikleyici oluşturun:

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

2
Yani, istediğimi yapmanın bir tetikleyici dışında başka bir yolu yok mu? Çünkü muhtemelen 300+ tüm tablolarım için 'güncelleme zaman damgasını' uygulamak istiyorum. Ve tetikleyiciler oluşturmanın bazı performans sorunlarına neden olabileceğini düşünüyorum.
bichonfrise74

5
Bildiğim kadarıyla postgresql'de bunu yapmanın standart yolu bu. Mysql'de "on update current_timestamp" yazdığınızda, arka planda tablo üzerinde bir tetikleyici oluşturur. Aradaki fark, tetiği sizin için yazmak yerine buraya elle yazmanızdır.
Charles Ma

3
Neredeyse hiçbir performans cezası yoktur - en azından herhangi bir makul veri tabanında.

5
İşleve parametre olarak güncellenmesi gereken sütun adını vermenin bir yolu var mı update_changetimestamp_column?
Antoan Milkov

7
@womble Bunun bir örneğini yayınlamak büyük olasılıkla çok faydalı olacaktır. Hangi sütunun güncelleneceğini dinamik olarak nasıl belirleyeceğimi yönetirsem, bunu bir cevap olarak yazacağım.
MirroredFate
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.