CURRENT_TIMESTAMP
একটি হিসাবে ব্যবহার করা যেতে পারে PRIMARY KEY
?
দুটি বা আরও বেশি আলাদা INSERTs পাওয়া গেলে কি একই সম্ভাবনা রয়েছে CURRENT_TIMESTAMP
?
CURRENT_TIMESTAMP
একটি হিসাবে ব্যবহার করা যেতে পারে PRIMARY KEY
?
দুটি বা আরও বেশি আলাদা INSERTs পাওয়া গেলে কি একই সম্ভাবনা রয়েছে CURRENT_TIMESTAMP
?
উত্তর:
অনুযায়ী ডকুমেন্টেশন , এর স্পষ্টতা CURRENT_TIMESTAMP
মাইক্রোসেকেন্ড হয়। সুতরাং, সংঘর্ষের সম্ভাবনা কম, তবে সম্ভব।
এখন একটি বাগটি কল্পনা করুন যা খুব কমই ঘটে এবং এটি ডাটাবেসের ত্রুটির কারণ হয়ে থাকে। এটি ডিবাগ করা কতটা কঠিন? এটি একটির চেয়েও খারাপ সমস্যা যা কমপক্ষে নির্বিচারক।
আরও বিস্তৃত প্রেক্ষাপট: আপনি সম্ভবত এই ক্ষুদ্রতর সূক্ষ্মতাগুলি এড়াতে চান সিকোয়েন্সগুলি, যা আপনি মাইএসকিউএলে অভ্যস্ত হলে বিশেষত বিরক্তিকর।
তদ্ব্যতীত, আপনি যদি লেনদেনগুলি ব্যবহার করছেন (বেশিরভাগ ওয়েব ফ্রেমওয়ার্কগুলি, বিশেষত জাভাগুলি, করুন!), তবে লেনদেনের সময় টাইমস্ট্যাম্পগুলি একই হবে! একটি প্রদর্শন:
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
কলাম ব্যবহার করতে পারেন, আপনি টেবিলটি কীভাবে সূচক করেন, তবে এটি কোনও কী নয় (যা আইডি)।
পিএস সাধারণভাবে, এটি আপনার ডিবিকে এতটাই নির্জনবাদী করে তোলা একটি খুব ভাল অনুশীলন , যেমন এটি সম্ভব। অর্থাৎ একই ক্রিয়াকলাপটি ডিবিতে ঠিক একই পরিবর্তন তৈরি করতে পারে । যে কোনও টাইমস্ট্যাম্প-ভিত্তিক আইডি এই গুরুত্বপূর্ণ বৈশিষ্ট্যটি ব্যর্থ করে। আপনি যদি কোনও কিছু ডিবাগ বা অনুকরণ করতে চান তবে কী হবে? আপনি একটি অপারেশন পুনরায় খেলুন এবং একই আইটেমটি একটি আলাদা আইডি দিয়ে তৈরি করা হবে ... এটি অনুসরণ করা সত্যই কঠিন নয় এবং এটি প্রচুর কাজের সময়কে ছাড়িয়ে যায়।
পিএস 2 ভবিষ্যতে যে কেউ আপনার কোড যাচাই করছেন, উপরের কারণে টাইমস্ট্যাম্প-জেনারেটড আইডিগুলি দেখার পক্ষে সর্বোত্তম মতামত থাকবে না।
INSERT
একাধিক সারি করে থাকেন তবে সেগুলি সমস্ত একই হয় current_timestamp
। এবং তারপরে আপনার ট্রিগার রয়েছে ...
সত্যই নয় কারণ CURRENT_TIMESTAMP এর পক্ষে পরবর্তী দুটি INSERTs (বা একাধিক সারি সহ একটি একক INSERT) এর জন্য দুটি অভিন্ন মান সরবরাহ করা সম্ভব।
পরিবর্তে সময় ভিত্তিক ইউআইডি ব্যবহার করুন: uuid_generate_v1mc () ।
কড়া কথা বলতে হবে: না কারণ CURRENT_TIMESTAMP
একটি ফাংশন এবং কেবলমাত্র এক বা একাধিক টেবিল কলাম একটি PRIMARY KEY
সীমাবদ্ধতা তৈরি করতে পারে ।
যদি আপনি PRIMARY KEY
ডিফল্ট মান সহ কোনও কলামে একটি সীমাবদ্ধতা তৈরি করতে চান CURRENT_TIMESTAMP
, তবে উত্তরটি হ্যাঁ, আপনি পারেন । কোনও কিছুই আপনাকে এটি করা থেকে বিরত রাখে না, যেমন কোনও কিছুই আপনাকে ছেলের মাথা থেকে আপেল শুটানো থেকে বিরত রাখে। আপনি এর উদ্দেশ্যটি সংজ্ঞায়িত না করার পরেও প্রশ্নটি এখনও অর্থবহ হবে না। কলাম এবং টেবিলটি কোন ধরণের ডেটা ধারণ করার কথা? আপনি কোন বিধি প্রয়োগ করার চেষ্টা করছেন?
সাধারণত, ধারণা ডুপ্লিকেট চাবি ত্রুটি মধ্যে চালানোর জন্য যেহেতু আবদ্ধ হয় CURRENT_TIMESTAMP
একটি হল STABLE
একই লেনদেনে (লেনদেনের এর শুরুর সময়) জন্য একই মান ফিরে ফাংশন। ইতিমধ্যে চিত্রিত অন্যান্য উত্তরগুলির মতো একই লেনদেনে একাধিক INSERT সংঘর্ষে আবদ্ধ। ম্যানুয়াল:
যেহেতু এই ফাংশনগুলি বর্তমান লেনদেনের প্রারম্ভিক সময়টি ফিরিয়ে দেয় তাই লেনদেনের সময় তাদের মান পরিবর্তন হয় না। এটি একটি বৈশিষ্ট্য হিসাবে বিবেচনা করা হয়: উদ্দেশ্যটি হ'ল একক লেনদেনকে "বর্তমান" সময়ের একটি ধারাবাহিক ধারণা থাকতে দেয়, যাতে একই লেনদেনের মধ্যে একাধিক পরিবর্তন একই সময়ের স্ট্যাম্প বহন করে।
পোস্টগ্রিস টাইমস্ট্যাম্পগুলি 8-বাইট পূর্ণসংখ্যা হিসাবে 6 টি ভগ্নাংশের সংখ্যা (মাইক্রোসেকেন্ড রেজোলিউশন) হিসাবে উপস্থাপিত হয় implemented
আপনি যদি এমন একটি টেবিল তৈরি করছেন যা মাইক্রোসেকেন্ডে এক সারি বেশি রাখার কথা নয় এবং সেই শর্তটি (নামধারী কিছু sensor_reading_per_microsecond
) বদলাচ্ছে না , তবে তা বোধগম্য হতে পারে। সদৃশ সারিগুলিতে সদৃশ কী লঙ্ঘনের ত্রুটি বাড়ানোর কথা । যদিও এটি একটি বহিরাগত ব্যতিক্রম। এবং ডেটা টাইপ timestamptz
(না timestamp
) সম্ভবত পছন্দনীয় হবে। দেখা:
আমি তার পরিবর্তে একটি সারোগেট সিরিয়াল প্রাথমিক কী ব্যবহার করব। এবং UNIQUE
টাইমস্ট্যাম্প কলামে একটি সীমাবদ্ধতা যুক্ত করুন। আরডিবিএমএসের প্রয়োগের বিশদগুলির উপর নির্ভর না করে খুব কম জটিলতা।
sensor_reading_per_microsecond
যদি আপনি একেবারে গ্যারান্টি দিতে না পারেন যে প্রতিটি পড়ার সময় পূর্ববর্তীটির সাথে সম্মতিতে পুরোপুরি সুসংগত হয়েছে; একটি সাব-মাইক্রোসেকেন্ড বিচ্যুতি (যা প্রায়শই অসম্ভব নয়) স্কিমটি ভেঙে দেয়। সাধারণভাবে আমি এখনও পুরোপুরি এড়াতে চাই। (মনে আছে, যেমন আপনি নির্দেশ করেছেন, যেমন একটি ক্ষেত্রে, ফলস্বরূপ সংঘর্ষ বাঞ্ছনীয় হতে পারে!)