मत। इसे कई बार आजमाया जा चुका है और यह दर्द होता है।
एक सादे 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
स्ट्राइक> . दोनों एक समझदार डेटा मॉडल में बेमानी होंगे।