मत। इसे कई बार आजमाया जा चुका है और यह दर्द होता है।
एक सादे serial का प्रयोग करें या IDENTITY कॉलम:
- ऑटो इंक्रीमेंट टेबल कॉलम
CREATE TABLE address_history (
address_history_id serial PRIMARY KEY
, person_id int NOT NULL REFERENCES people(id)
, created_at timestamp NOT NULL DEFAULT current_timestamp
, previous_address text
);
विंडो फ़ंक्शन का उपयोग करें row_number() प्रति person_id . में अंतराल के बिना क्रमांक प्राप्त करने के लिए . आप एक VIEW जारी रख सकते हैं कि आप उन नंबरों को तैयार करने के लिए प्रश्नों में अपनी तालिका के लिए ड्रॉप-इन प्रतिस्थापन के रूप में उपयोग कर सकते हैं:
CREATE VIEW address_history_nr AS
SELECT *, row_number() OVER (PARTITION BY person_id
ORDER BY address_history_id) AS adr_nr
FROM address_history;
देखें:
- गैप-रहित अनुक्रम जहां एकाधिक तालिकाओं के साथ अनेक लेन-देन शामिल हैं
या हो सकता है कि आप ORDER BY . करना चाहें कुछ और। शायद created_at ? बेहतर created_at, address_history_id संभावित संबंधों को तोड़ने के लिए। संबंधित उत्तर:
- वैकल्पिक धारावाहिकों वाला कॉलम
साथ ही, आप जिस डेटा प्रकार की तलाश कर रहे हैं वह है timestamp या timestamptz , नहीं <स्ट्राइक>datetime स्ट्राइक> पोस्टग्रेज में:
- रेल और पोस्टग्रेएसक्यूएल में टाइम ज़ोन को पूरी तरह नज़रअंदाज़ करना
और आपको केवल previous_address स्टोर करने की आवश्यकता है (या अधिक विवरण), नहीं <स्ट्राइक> address स्ट्राइक> , न ही <स्ट्राइक>original_address स्ट्राइक> . दोनों एक समझदार डेटा मॉडल में बेमानी होंगे।