CURRENT_TIMESTAMP
एक के रूप में इस्तेमाल किया जा सकता है PRIMARY KEY
?
क्या एक संभावना है कि दो या अधिक अलग-अलग INSERT, समान हों CURRENT_TIMESTAMP
?
CURRENT_TIMESTAMP
एक के रूप में इस्तेमाल किया जा सकता है PRIMARY KEY
?
क्या एक संभावना है कि दो या अधिक अलग-अलग INSERT, समान हों CURRENT_TIMESTAMP
?
जवाबों:
प्रलेखन के अनुसार , CURRENT_TIMESTAMP
सूक्ष्मदर्शी सूक्ष्मदर्शी है। इस प्रकार, टकराव की संभावना कम है, लेकिन संभव है।
अब एक बग की कल्पना करें जो बहुत कम ही होता है , और डेटाबेस त्रुटियों का कारण बनता है। इसे डीबग करना कितना कठिन है? यह कम से कम नियतात्मक है जो एक से अधिक बग बग है।
अधिक व्यापक संदर्भ: आप शायद सीक्वेंस के साथ इन छोटी बारीकियों से बचना चाहते हैं, जो विशेष रूप से कष्टप्रद है यदि आप MySQL के आदी हैं।
इसके अलावा, यदि आप लेनदेन का उपयोग कर रहे हैं (ज्यादातर वेब फ्रेमवर्क, विशेष रूप से जावा वाले, करते हैं!), तो टाइमस्टैम्प एक लेनदेन के अंदर ही होगा! प्रदर्शन:
postgres=# begin;
BEGIN
postgres=# select current_timestamp;
current_timestamp
-------------------------------
2018-08-06 02:41:42.472163+02
(1 Zeile)
postgres=# select current_timestamp;
current_timestamp
-------------------------------
2018-08-06 02:41:42.472163+02
(1 Zeile)
फिर मिलते हैं? दो का चयन, बिल्कुल उसी परिणाम। मैं इतनी जल्दी टाइप नहीं करता। ;-)
-
यदि आप आसानी से आईडी चाहते हैं, तो अनुक्रमों के उपयोग से बचें, तो रिकॉर्ड के वास्तविक पहचानकर्ताओं से कुछ हैश मान उत्पन्न करें। उदाहरण के लिए, यदि आपके डेटाबेस में मानव हैं, और आप जानते हैं कि उनकी जन्मतिथि, माता का पहला नाम और वास्तविक नाम विशिष्ट रूप से उनकी पहचान करता है, तो एक का उपयोग करें
md5(mother_name || '-' || given_name || '-' birthday);
आईडी के रूप में। इसके अलावा, आप एक CreationDate
तालिका का उपयोग करने के बाद एक कॉलम का उपयोग कर सकते हैं , लेकिन यह एक कुंजी नहीं है (जो कि आईडी है)।
Ps सामान्य तौर पर, अपने DB को इतना निर्धारक बनाना एक बहुत अच्छा अभ्यास है, क्योंकि यह संभव है। यानी एक ही ऑपरेशन को DB में ठीक उसी परिवर्तन को बनाना चाहिए । कोई भी टाइमस्टैम्प-आधारित आईडी इस महत्वपूर्ण विशेषता को विफल करती है। यदि आप डिबग या किसी चीज़ का अनुकरण करना चाहते हैं तो क्या होगा? आप एक ऑपरेशन फिर से करते हैं और एक ही ऑब्जेक्ट को एक अलग आईडी के साथ बनाया जाएगा ... यह वास्तव में पालन करना मुश्किल नहीं है, और यह बहुत काम के घंटे बख्शता है।
Ps2 भविष्य में आपके कोड की जांच करने वाला कोई भी व्यक्ति, उपरोक्त कारणों से टाइमस्टैम्प-जनरेट किए गए आईडी को देखने की सबसे अच्छी राय नहीं होगी।
INSERT
कई पंक्तियों को करते हैं, तो वे सभी समान हो जाते हैं current_timestamp
। और फिर आपके पास ट्रिगर होता है ...
वास्तव में नहीं है क्योंकि CURRENT_TIMESTAMP के लिए दो बाद के INSERT (या एक से अधिक INSERT कई पंक्तियों के साथ) के लिए दो समान मान प्रदान करना संभव है।
इसके बजाय समय-आधारित UUID का उपयोग करें: uuid_generate_v1mc () ।
सख्ती से बोलना: नहीं। क्योंकि CURRENT_TIMESTAMP
एक फ़ंक्शन है और केवल एक या अधिक टेबल कॉलम एक PRIMARY KEY
बाधा बना सकते हैं।
यदि आप PRIMARY KEY
डिफ़ॉल्ट मान के साथ एक स्तंभ पर एक बाधा बनाने का मतलब है CURRENT_TIMESTAMP
, तो जवाब है: हाँ, आप कर सकते हैं । कुछ भी आपको ऐसा करने से रोकता है, जैसे कुछ भी नहीं आपको अपने बेटे के सिर से सेब की शूटिंग करने से रोकता है। जब आप इसके उद्देश्य को परिभाषित नहीं करते हैं तब भी यह सवाल समझ में नहीं आएगा। कॉलम और टेबल किस प्रकार के डेटा को धारण करने वाले हैं? आप किन नियमों को लागू करने की कोशिश कर रहे हैं?
आमतौर पर, यह विचार डुप्लिकेट कुंजी त्रुटियों में चलाने के लिए बाध्य है क्योंकि CURRENT_TIMESTAMP
एक STABLE
ही लेन-देन के लिए समान मूल्य (लेनदेन का प्रारंभ समय) लौटाने वाला एक फ़ंक्शन है। एक ही लेन-देन में कई INSERTs टकराने के लिए बाध्य हैं - जैसे पहले से सचित्र अन्य उत्तर। नियम पुस्तिका:
चूंकि ये फ़ंक्शन वर्तमान लेन-देन का प्रारंभ समय लौटाते हैं, इसलिए लेनदेन के दौरान उनके मूल्य नहीं बदलते हैं। इसे एक विशेषता माना जाता है: इरादा एक एकल लेनदेन को "वर्तमान" समय की सुसंगत धारणा रखने की अनुमति देना है, ताकि एक ही लेनदेन के भीतर कई संशोधनों में एक ही समय की मुहर लगे।
पोस्टग्रैट्स टाइमस्टैम्प्स को 8-बाइट पूर्णांकों के रूप में लागू किया जाता है जो 6 भिन्नात्मक अंकों (माइक्रोसेकंड रिज़ॉल्यूशन) का प्रतिनिधित्व करता है।
यदि आप एक ऐसी तालिका का निर्माण कर रहे हैं, जिसे प्रति माइक्रोसेकंड में एक पंक्ति से अधिक नहीं रखना चाहिए और यह स्थिति बदलने वाली नहीं है (नाम कुछ sensor_reading_per_microsecond
), तो इसका अर्थ हो सकता है। डुप्लिकेट पंक्तियों को एक डुप्लिकेट कुंजी उल्लंघन त्रुटि को बढ़ाने के लिए माना जाता है। हालांकि यह एक अपवाद है। और डेटा प्रकार timestamptz
(नहीं timestamp
) शायद बेहतर होगा। देख:
मैं अब भी इसके बजाय एक सरोगेट सीरियल प्राथमिक कुंजी का उपयोग करेगा। और UNIQUE
टाइमस्टैम्प कॉलम पर एक बाधा जोड़ें । आरडीबीएमएस के कार्यान्वयन के विवरण पर भरोसा न करते हुए, कम संभव जटिलताओं।
sensor_reading_per_microsecond
टकरा सकता है यदि आप पूरी तरह से गारंटी नहीं दे सकते हैं कि प्रत्येक पढ़ने का समय पिछले एक के संबंध में पूरी तरह से सिंक्रनाइज़ है; एक उप-माइक्रोसेकंड विचलन (जो अक्सर असंभव नहीं है) योजना को तोड़ता है। सामान्य तौर पर मैं अभी भी पूरी तरह से इससे बचूंगा। (ध्यान दें, जैसा कि आपने संकेत दिया है, ऐसे मामले में, परिणामी टक्कर वांछनीय हो सकती है!)