CURRENT_TIMESTAMP কি প্রাথমিক কী হিসাবে ব্যবহার করা যেতে পারে?


10

CURRENT_TIMESTAMPএকটি হিসাবে ব্যবহার করা যেতে পারে PRIMARY KEY?

দুটি বা আরও বেশি আলাদা INSERTs পাওয়া গেলে কি একই সম্ভাবনা রয়েছে CURRENT_TIMESTAMP?


3
আমি এমন একটি অ্যাপ শুনেছি যা পিকে হিসাবে টাইমস্ট্যাম্প ব্যবহার করে কোড করা হয়েছিল, ১৯৯০ এর দশকে। দশ বছর পরে পিসি দ্রুত হয়ে যায় এবং টাইমস্ট্যাম্পগুলি সদৃশ হয়েছিল। এটি অ্যাপ্লিকেশনটির কার্যকারিতা অত্যন্ত সমালোচিত হওয়ায় এটি খুব মারাত্মক সমস্যা সৃষ্টি করেছিল। এছাড়াও, অ্যাপ্লিকেশন জুড়ে পিকে স্বতন্ত্রতা যথাযথভাবে প্রয়োগ করা হয়নি।
ভিক্টর ডি লিও

দুটি বা আরও বেশি আলাদা INSERTs, একই CURRENT_TIMESTAMP পাওয়ার সম্ভাবনা আছে কি? এটি সংঘর্ষের জন্য যথেষ্ট একটি ক্যোয়ারী 2 টি রেকর্ড .োকানো হয়েছে। সুতরাং কোনও বিষয়ের প্রশ্নের উত্তর হ'ল "না"।
আকিনা


3
আমি জানতে আগ্রহী যে আপনি এটি কেন চান?
Nanne

@ ন্যান আমি এটি সন্দেহ করি: মাইএসকিউএল স্বয়ংক্রিয়ভাবে বর্ধিত পূর্ণসংখ্যার আইডির (ক্ষেত্রের জন্য কেবল একটি স্বয়ংক্রিয়_আগ্রহ বৈশিষ্ট্য) খুব সুন্দর পরিচালনা করে। PostgreSQL নেই, এর একটি সিরিয়াল টাইপ রয়েছে যা অনেক কম সুন্দর les
পিটারহ - মনিকা পুনরায় ইনস্টল করুন '15

উত্তর:


18

অনুযায়ী ডকুমেন্টেশন , এর স্পষ্টতা 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। এবং তারপরে আপনার ট্রিগার রয়েছে ...
কেভিন

2
আমি এমন একটি অ্যাপ্লিকেশন সম্পর্কে শুনেছি যা ভেঙে যায় কারণ 2 জন ছেলের একই নাম ছিল এবং একই দিনে জন্মগ্রহণ করেছিল এবং তাদের মায়ের নামগুলি অভিন্ন ছিল। সেকি। যদি এটি ঘটতে পারে তবে তা খুব শীঘ্রই বা পরে ঘটবে।
বালাজস গানিকস

@ বালাজসগুনিক্স হেলó :-) এটি কেবল একটি উদাহরণ ছিল। উদাহরণস্বরূপ, বাস্তব পরিস্থিতিতে, আমি মনে করি যে ইমেল ঠিকানা বা নির্বাচিত ব্যবহারকারীর নাম হিসাবে আইডি (যা এখনও উপস্থিত না থাকলে কেবল নিবন্ধিত হতে পারে) যথেষ্ট। সরকার কিছু ব্যক্তিগত সনাক্তকরণ নম্বর যেমন 1 870728 0651 ব্যবহার করার প্রবণতা রাখে।
পিটারহ - মনিকা পুনরায় ইনস্টল করুন

@ বালাজস গুনিক্স এর পাশাপাশি, একই মাতৃমন্ত্রিত + দেওয়া_নাম + জন্মদিনের সাথে দুজন লোক, এটি এখনও একটি নির্জনবাদী ত্রুটির কারণ হতে পারে। একই মাইক্রোসেকেন্ডে সন্নিবেশ করানোতে দুটি লেনদেনের কারণে প্রাথমিক কী সংঘর্ষ হয়েছে, এটি এখনও একটি অ-সং-বিরোধী এবং খুব কমই পুনরুত্পাদনযোগ্য সমস্যা।
পিটার - মনিকা পুনরায় ইনস্টল করুন

10

সত্যই নয় কারণ CURRENT_TIMESTAMP এর পক্ষে পরবর্তী দুটি INSERTs (বা একাধিক সারি সহ একটি একক INSERT) এর জন্য দুটি অভিন্ন মান সরবরাহ করা সম্ভব।

পরিবর্তে সময় ভিত্তিক ইউআইডি ব্যবহার করুন: uuid_generate_v1mc ()


7

কড়া কথা বলতে হবে: না কারণ 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যদি আপনি একেবারে গ্যারান্টি দিতে না পারেন যে প্রতিটি পড়ার সময় পূর্ববর্তীটির সাথে সম্মতিতে পুরোপুরি সুসংগত হয়েছে; একটি সাব-মাইক্রোসেকেন্ড বিচ্যুতি (যা প্রায়শই অসম্ভব নয়) স্কিমটি ভেঙে দেয়। সাধারণভাবে আমি এখনও পুরোপুরি এড়াতে চাই। (মনে আছে, যেমন আপনি নির্দেশ করেছেন, যেমন একটি ক্ষেত্রে, ফলস্বরূপ সংঘর্ষ বাঞ্ছনীয় হতে পারে!)
অরবিটে

@ লাইটনেস: আমি সম্পূর্ণ চুক্তিতে আছি বৃত্তাকার ক্ষুদ্র ক্ষুদ্র বিচ্যুতির পরে অজান্তেই সময়-শিফ্টের সাথে আপনার উদাহরণটি অন্য একটি সতর্কতার চিত্র তুলে ধরে।
এরউইন ব্র্যান্ডস্টেটার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.