मैं स्वतः ही PostgreSQL में टाइमस्टैम्प को कैसे अपडेट करूं


132

मैं चाहता हूं कि कोड उस समय स्टैम्प को स्वचालित रूप से अपडेट करने में सक्षम हो जब एक नई पंक्ति डाली जाए क्योंकि मैं CURRENT_TIMESTAMP का उपयोग करके MySQL में कर सकता हूं।

मैं PostgreSQL में इसे कैसे प्राप्त कर पाऊंगा?

CREATE TABLE users (
    id serial not null,
    firstname varchar(100),
    middlename varchar(100),
    lastname varchar(100),
    email varchar(200),
    timestamp timestamp
)

6
वैसे, timestampसंक्षिप्त नाम के रूप में SQL डेटा द्वारा आपके डेटा प्रकार को परिभाषित किया गया है TIMESTAMP WITHOUT TIME ZONE। यह लगभग निश्चित रूप से नहीं है कि आप क्या चाहते हैं, जैसा कि Postgres विशेषज्ञ डेविड ई। व्हीलर द्वारा समझाया गया है । अन्य प्रकार, TIMESTAMP WITH TIME ZONEसंभवतः वह है जो आप चाहते हैं, किसी भी पारित समय क्षेत्र का उपयोग करके सूचना को UTC को दिनांक-समय समायोजित करने के लिए ऑफसेट करें (लेकिन वास्तव में उस प्रकार के नाम के बावजूद उस समय क्षेत्र की जानकारी संग्रहीत नहीं कर रहे हैं)।
बेसिल बॉर्क

3
फिर से इसे फिर से जानने के बाद, मैंने एक पंक्ति के निर्माण और डिफ़ॉल्ट, फ़ंक्शन और ट्रिगर का उपयोग करके संशोधन की तिथि-समय लॉग करने के बारे में एक विस्तृत ब्लॉग पोस्ट लिखा । Postgres में उपयोग के लिए पूरा उदाहरण SQL और PL / pgSQL कोड शामिल है।
बेसिल बॉर्क

जवाबों:


197

डालने के दौरान कॉलम को पॉप्युलेट करने के लिए, एक DEFAULTमान का उपयोग करें :

CREATE TABLE users (
  id serial not null,
  firstname varchar(100),
  middlename varchar(100),
  lastname varchar(100),
  email varchar(200),
  timestamp timestamp default current_timestamp
)

ध्यान दें कि उस कॉलम का मान स्पष्ट रूप से INSERTविवरण में मूल्य की आपूर्ति करके ओवरराइट किया जा सकता है । यदि आप रोकना चाहते हैं कि आपको ट्रिगर की आवश्यकता है ।

जब भी पंक्ति को अपडेट किया जाए तो आपको एक ट्रिगर की आवश्यकता होती है जब भी पंक्ति को अपडेट किया जाता है (जैसा कि ईजे ब्रेनन ने उल्लेख किया है )

ध्यान दें कि कॉलम नामों के लिए आरक्षित शब्दों का उपयोग करना आमतौर पर एक अच्छा विचार नहीं है। से अलग नाम ढूंढना चाहिएtimestamp


14
ज्ञात रहे कि पोस्टग्रैज के पास वास्तविक वर्तमान क्षण का समय (1) आपको बताने का कार्य है, (2) जिस समय वक्तव्य शुरू हुआ था, और (3) लेनदेन शुरू होने का समय। यहां दिखाया गया उदाहरण वर्तमान लेनदेन का प्रारंभ है। अन्य दो संभावनाओं के विपरीत आप ऐसा नहीं कर सकते या नहीं कर सकते।
तुलसी बोरक

6
आरक्षित शब्दों के साथ टकराने वाले नामों से बचने के बारे में अच्छा बोनस बिंदु। ध्यान दें कि SQL युक्ति स्पष्ट रूप से एक आरक्षित शब्द के रूप में अनुगामी अंडरस्कोर का उपयोग नहीं करने का वादा करती है। तो अगर आप कर सकते हैं timestampमें timestamp_। इससे भी बेहतर एक और वर्णनात्मक नाम सुच्चा होगा row_created_
तुलसी बोर्क

पहली छमाही वह नहीं है जो ओपी ने पूछा है, भले ही दूसरी छमाही ने अन्य उत्तर (जो सही है) का उल्लेख किया है, लेकिन यह अभी भी गलत है। इसे उत्तर के रूप में स्वीकार नहीं किया जाना चाहिए।
एरिक वांग

1
प्रकारों के पोस्टग्रेज डॉक्यूमेंटेशन में ऐसा कहते हैं। वरचर में बाधा के लिए अतिरिक्त CPU चक्र हैं, जो TEXT पर नहीं होते हैं।
राही

3
एक फ़ील्ड के साथ नहीं, लेकिन मैंने कभी भी एक फ़ील्ड के साथ उपयोगी तालिका नहीं देखी है। यह बाधा खेतों की संख्या से मिश्रित होती है। मुझे याद है कि टैक्स्ट की तालिका में सभी वर्चर्स को बदलना और 15% लेखन सुधार प्राप्त किया। साथ ही, छोटा प्रदर्शन जुर्माना "NO" प्रदर्शन जुर्माना नहीं है।
राहुल

104

यदि आप रिकॉर्ड बदलना चाहते हैं तो आपको एक आवेषण ट्रिगर लिखना होगा, और यदि आप इसे बदलना चाहते हैं तो एक अद्यतन ट्रिगर संभव है। यह लेख इसे काफी अच्छी तरह से समझाता है:

http://www.revsys.com/blog/2006/aug/04/automatically-updating-a-timestamp-column-in-postgresql/

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

इस तरह ट्रिगर लागू करें:

CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON customer FOR EACH ROW EXECUTE PROCEDURE  update_modified_column();

2
यह सबसे अच्छा जवाब है, IMO (हालांकि, डिफ़ॉल्ट रूप से सम्मिलित करने के लिए पर्याप्त है)।
किक

2
यहाँ नया क्या है?
नवीन


यह एक अधिक संपूर्ण समाधान है जो प्रारंभिक INSERTs के साथ-साथ किसी भी बाद के UPDATEs (डेटा ऑडिटिंग के लिए अच्छा) के साथ काम करेगा। दी, ओपी केवल पूर्व के लिए पूछता है।
पावेल लेकेव

5
@ नवीन ज्यादा नहीं, आपके साथ क्या नया है?
15

57

टाइमस्टैम्प को अपडेट करना, तभी मान बदले गए

EJ के लिंक के आधार पर और इस लिंक से एक स्टेटमेंट जोड़ें ( https://stackoverflow.com/a/3084254/1560660 )

CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
   IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN
      NEW.modified = now(); 
      RETURN NEW;
   ELSE
      RETURN OLD;
   END IF;
END;
$$ language 'plpgsql';

9

डिफ़ॉल्ट मान के रूप में 'अब ()' का उपयोग करना स्वचालित रूप से समय-स्टैंप उत्पन्न करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.