2010-03-02 11 views
18

नीचे mysql कोडPostgresql वर्तमान टाइमस्टैम्प

CREATE TABLE t1 (
    created TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    modified TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
); 
CREATE TABLE t2 (
    created TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    modified TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
); 

प्रति एलेक्स Brasetvik नीचे का जवाब के रूप में की postgres बराबर क्या है, यह मैं चलाता साथ जाना चाहिए लगता है, मेरी समस्या मैं टेबल t1 की एक संख्या है है , टी 2 ... निर्मित और संशोधित क्षेत्रों के साथ, क्या एक सामान्यीकृत प्रक्रिया लिखना संभव है?

--update लगभग तैयार

CREATE FUNCTION update_timestamp() RETURNS trigger AS $update_timestamp$ 
    BEGIN 
     NEW.modified := current_timestamp; 
     RETURN NEW; 
    END; 
$update_timestamp$ LANGUAGE plpgsql; 

CREATE TRIGGER update_timestamp BEFORE INSERT OR UPDATE ON t1 
    FOR EACH ROW EXECUTE PROCEDURE update_timestamp(); 
CREATE TRIGGER update_timestamp BEFORE INSERT OR UPDATE ON t2 
    FOR EACH ROW EXECUTE PROCEDURE update_timestamp(); 

उत्तर

17

बस सुनिश्चित करें कि सभी तालिकाओं ही columnName बनाती हैं:

CREATE OR REPLACE FUNCTION upd_timestamp() RETURNS TRIGGER 
LANGUAGE plpgsql 
AS 
$$ 
BEGIN 
    NEW.modified = CURRENT_TIMESTAMP; 
    RETURN NEW; 
END; 
$$; 

CREATE TRIGGER t_name 
    BEFORE UPDATE 
    ON tablename 
    FOR EACH ROW 
    EXECUTE PROCEDURE upd_timestamp(); 
+0

धन्यवाद, आपने यह किया! –

4

एक ट्रिगर के साथ अद्यतन करें। Documentation and examples

+0

धन्यवाद एलेक्स, आप बिल्कुल सही हैं, मैंने अपना प्रश्न अपडेट किया है, कृपया यह भी देखें कि –

8

जानकारी मिथुन और एलेक्स Brasetvik के लिए धन्यवाद।

मैं ट्रिगर में एक मामूली चिमटा जोड़ना चाहता हूं। चूंकि हम अधिकतर संभवतः संशोधित कॉलम को टाइमस्टैम्प को स्टोर करने के लिए संशोधित करना चाहते थे, जब पंक्ति को अंतिम बार बदल दिया गया था, न कि जब यह अद्यतन विवरण का लक्ष्य था, तो हमें पंक्ति के नए और पुराने मान की तुलना करना होगा। हम संशोधित कॉलम केवल तभी अपडेट करते हैं जब ये दो मान अलग-अलग हों।

CREATE OR REPLACE FUNCTION update_modified_timestamp() RETURNS TRIGGER 
LANGUAGE plpgsql 
AS 
$$ 
BEGIN 
    IF (NEW != OLD) THEN 
     NEW.modified = CURRENT_TIMESTAMP; 
     RETURN NEW; 
    END IF; 
    RETURN OLD; 
END; 
$$; 

यह ट्रिगर सुनिश्चित करता है कि संशोधित स्तंभ अद्यतन किया जाता है केवल अगर अद्यतन आपरेशन वास्तव में पंक्ति में संग्रहीत मान बदल जाता है।

संबंधित मुद्दे