Gোকানোর বিবৃতি পোস্টগ্রিজে একটি ইউইউডি তৈরি করছেন?


367

আমার প্রশ্ন বরং সহজ। আমি একটি ইউআইডি ধারণা সম্পর্কে সচেতন এবং আমার ডিবিতে একটি 'স্টোর' থেকে প্রতিটি 'আইটেম' উল্লেখ করার জন্য একটি উত্পন্ন করতে চাই। যুক্তিসঙ্গত ঠিক মনে হচ্ছে?

সমস্যাটি হ'ল নিম্নলিখিত লাইনটি একটি ত্রুটি প্রদান করে:

honeydb=# insert into items values(
uuid_generate_v4(), 54.321, 31, 'desc 1', 31.94);
ERROR:  function uuid_generate_v4() does not exist
LINE 2: uuid_generate_v4(), 54.321, 31, 'desc 1', 31.94);
        ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

আমি পৃষ্ঠাটি এখানে পড়েছি: http://www.postgresql.org/docs/current/static/uuid-ossp.html

এখানে চিত্র বর্ণনা লিখুন

আমি উবুন্টু 10.04 এক্স 64 এ পোস্টগ্রিস 8.4 চালাচ্ছি।


8
Postgres নেটিভ সমর্থন UUID একটি ডাটা প্রকার, ইন্ডেক্স এবং প্রাথমিক কী হিসাবে ব্যবহার করা হচ্ছে এমনকি সক্ষম হয়। তবে কোনও ইউআইডি মান তৈরি করতে যেমন কলামের জন্য একটি ডিফল্ট মান স্থাপন করতে আপনার পোস্টগ্রিস এক্সটেনশন (একটি প্লাগইন) প্রয়োজন। পোস্টগ্রিসের অনেকগুলি বিল্ড (বিতরণ) এ জাতীয় এক্সটেনশান অন্তর্ভুক্ত করে তবে এক্সটেনশনটি সক্রিয় করে না। কীভাবে এটি সক্রিয় করা যায় তা জানতে ক্রেগ রিঞ্জার সঠিক উত্তরটি দেখুন ।
বাসিল বাউর্কে

2
আপনি যদি ইউইড-ওএসপি ইনস্টল করে থাকেন এবং এখনও এই ত্রুটিটি আপনার স্কিমা নামের সাথে ফাংশনটির উপসর্গের চেষ্টা করুন, যেমনselect dbo.uuid_generate_v4()
রিচার্ড

উত্তর:


435

uuid-osspএকটি অবদান মডিউল, তাই এটি ডিফল্টরূপে সার্ভারে লোড হয় না। এটি ব্যবহারের জন্য আপনাকে অবশ্যই এটি আপনার ডাটাবেসে লোড করতে হবে।

আধুনিক পোস্টগ্রেএসকিউএল সংস্করণগুলির জন্য (9.1 এবং আরও নতুন) এটি সহজ:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

9.0 এবং নীচের জন্য আপনাকে অবশ্যই এক্সটেনশন লোড করার জন্য এসকিউএল স্ক্রিপ্ট চালাতে হবে। 8.4.4 এ অবদান মডিউলগুলির জন্য ডকুমেন্টেশন দেখুন ।

Pg 9.1 এর জন্য এবং আরও নতুন পরিবর্তে বর্তমান অবদানকারী ডক্স এবং পড়ুন CREATE EXTENSION। এই বৈশিষ্ট্যগুলি আপনার 8.4 এর মতো 9.0 বা পুরানো সংস্করণগুলিতে বিদ্যমান নেই।

আপনি যদি PostgreSQL এর একটি প্যাকেজযুক্ত সংস্করণ ব্যবহার করছেন তবে আপনাকে অবদানকারী মডিউল এবং এক্সটেনশানগুলি সহ একটি পৃথক প্যাকেজ ইনস্টল করতে হবে। 'পোস্টগ্রিজ' এবং 'অবদান' এর জন্য আপনার প্যাকেজ পরিচালকের ডেটাবেস অনুসন্ধান করুন।


6
@ অ্যাডভোকট আপনি একটি ডিসট্রো-প্যাকেজড পোস্টগ্র্যাস এসকিউএল ব্যবহার করছেন যাতে আপনার ঠিক apt-get install postgresql-contribবা অনুরূপ হতে সক্ষম হওয়া উচিত । আপনি apt-cache search postgresql |grep contribযে প্যাকেজটির নাম চান সেটি সন্ধান করার চেষ্টা করুন ।
ক্রেগ রিঞ্জার

2
sudo apt-get ইনস্টল postgresql- অবদান সফলভাবে চলেছে। তারপরে আমাকে PSQL -d dbname -f SHAREDIR / योगदान / মডিউল.এসকিএল চালাতে হয়েছিল এবং এখন এটি কার্যকর হয় !!! uuid_generate_v1 () নির্বাচন করুন; এখন 1 ফেরত। অনেক ধন্যবাদ!
anon58192932

5
মনে রাখবেন যে আপনি যদি postgresql-contribপ্যাকেজটি ইনস্টল না করেন তবে আপনি ত্রুটিটি পেয়ে যাবেন: ERROR: এক্সটেনশন নিয়ন্ত্রণ ফাইলটি খুলতে পারেনি "/usr/share/postgresql/9.3/extension/uuid-ossp.control": এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই
ড্রয় নোকস

1
গুগলে ত্রুটি স্ট্রিং শুরু হওয়ায় আমি এই মন্তব্যটি পোস্ট করেছি। এছাড়াও এটি উবুন্টুর জন্য একটি নির্দিষ্ট প্যাকেজের নাম দেয়।
ড্রয় নোকস

2
আপনি যদি এমন কোনও ডিবি আমদানি করেন যা ইতিমধ্যে এক্সটেনশনে uuid-ossp রয়েছে তবে uuid_generate_v4 () কাজ না করে। যদি এটি হয় তবে কেবল এক্সটেনশানটি সরিয়ে ফেলুন এবং এটি আবার তৈরি করুন এবং এটি কাজ করা উচিত।
ড্র্যাগস রুস

302

এক্সটেনশন ছাড়াই (প্রতারণা)

SELECT uuid_in(md5(random()::text || clock_timestamp()::text)::cstring);

output>> c2d29867-3d0b-d497-9191-18a9d8ee7830

(কমপক্ষে 8.4 এ কাজ করে)

  • clock_timestamp()ব্যাখ্যার জন্য @ ইরউইন ব্র্যান্ডস্টেটরকে ধন্যবাদ ।

আপনার যদি একটি বৈধ ভি 4 ইউআইডি প্রয়োজন হয়

SELECT uuid_in(overlay(overlay(md5(random()::text || ':' || clock_timestamp()::text) placing '4' from 13) placing to_hex(floor(random()*(11-8+1) + 8)::int)::text from 17)::cstring);

এখানে চিত্র বর্ণনা লিখুন * @ ডেনিস স্টাফিচুক @ কার্স্টেন এবং @ অট্রোনিক্সকে ধন্যবাদ


এছাড়াও আধুনিক পোস্টগ্রিসে আপনি কেবল কাস্ট করতে পারেন:

SELECT md5(random()::text || clock_timestamp()::text)::uuid


5
আপনার পিএস অনুসরণ করতে: নির্বাচন করুনuuid_in(md5(random()::text || now()::text)::cstring);
ব্লেস্কোভিজ

4
@ ম্যাটডিপ্যাস্কোয়েল সম্ভবত কোনওভাবেই ব্যবহারের চেয়ে "ভাল" uuid-osspনয়, তবে আমি উদাহরণস্বরূপ পোস্টগ্র্রেএসকিউএল ইভেন্টে কাজ করছি যেখানে আমার কোনও এক্সটেনশন ইনস্টল করার পর্যাপ্ত সুযোগসুবিধা নেই।
স্টিফান হ্যাবারেল

25
@ জোসেফলেনক্স: এর clock_timestamp()ক্ষেত্রে উভয় ক্ষেত্রেই এর চেয়ে ভাল বিকল্প। বিপরীতে now()বা CURRENT_TIMESTAMPএটি অস্থির এবং আসল বর্তমান সময়টি ফেরত দেয়। SELECT uuid_in(md5(random()::text || clock_timestamp()::text)::cstring);এছাড়াও, আধুনিক পোস্টগ্র্রেসে আপনি কেবল কাস্ট করতে পারেন: SELECT md5(random()::text || clock_timestamp()::text)::uuid- আরও যাদু করার প্রয়োজন নেই। ব্যবহারের ক্ষেত্রে: স্ট্যাকওভারফ্লো.com
এরউইন ব্র্যান্ডসটেটার

17
নাঃ। এটি যদি তার নিখুঁত ভাগ্যে কাজ করে। একটি ইউআইডি-র একটি ফর্ম্যাট থাকে, এটি কেবল এলোমেলো হেক্স চরগুলি একসাথে নিক্ষেপ করা হয় না 3rd তৃতীয় গ্রুপের প্রথম সংখ্যাটি হ'ল ইউউইড সংস্করণ (সাধারণত এই দিনগুলিতে 4)। যদি আপনার অ্যাপ্লিকেশনটি সেই অঙ্কটি পরীক্ষা করে যদি ইউইডির কোন সংস্করণটি এর সাথে সম্পর্কিত হয় তা দেখতে এবং সে অনুসারে কিছু করে, এটি আপনার কোডে ব্যর্থ হবে।
টুনচে Göncüoğlu

7
: @Tuncay Göncüoğlu: এটা মোটামুটি সহজবোধ্য একটি বৈধ V4 UUID (STRING আস্তরণ পদ্ধতির বর্জ্য যদৃচ্ছতা যদিও এর 2 বিট) তৈরি করতে পারেনselect overlay(overlay(md5(random()::text || ':' || clock_timestamp()::text) placing '4' from 13) placing '8' from 17)::uuid;
কার্স্টেন

75

ক্রেগ রিঙ্গার দ্বারা উত্তর সঠিক। পোস্টগ্রিস ৯.১ এবং তার পরে আরও কিছু তথ্য এখানে…

এক্সটেনশন পাওয়া যায়?

আপনি কেবল তখনই কোনও এক্সটেনশন ইনস্টল করতে পারেন যদি এটি ইতিমধ্যে আপনার পোস্টগ্রিজ ইনস্টলেশন (পোস্টগ্রিস লিংগোতে আপনার ক্লাস্টার ) তৈরি করা হয়েছে। উদাহরণস্বরূপ, আমি ইউকিড-ওএসপি এক্সটেনশনটি ম্যাক ওএস এক্স এর জন্য ইনস্টলারের অংশ হিসাবে অন্তর্ভুক্তভাবে দয়া করে এন্টারপ্রাইজবিবি.কম দ্বারা সরবরাহিত পেয়েছি । কয়েক ডজন এক্সটেনশনের যে কোনও উপলব্ধ হতে পারে।

আপনার পোস্টগ্রিস ক্লাস্টারে ইউইড-ওএসপি এক্সটেনশন পাওয়া যায় কিনা তা দেখতে , pg_available_extensionsসিস্টেম ক্যাটালগটিকে জিজ্ঞাসা করতে এই এসকিউএল চালান :

SELECT * FROM pg_available_extensions;

এক্সটেনশন ইনস্টল করুন

সেই ইউইউডি- রিলেটেড এক্সটেনশানটি ইনস্টল করতে , এই এসকিউএল-র মতো তৈরি করা এক্সটেনশন কমান্ডটি ব্যবহার করুন :

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

সাবধানতা : বিপরীতে ডকুমেন্টেশন সত্ত্বেও, প্রয়োজনীয় এক্সটেনশন নামের চারপাশে উদ্ধৃতি চিহ্নের অক্ষরগুলি পেয়েছি।

এসকিউএল স্ট্যান্ডার্ড কমিটি বা পোস্টগ্রিস টিম সেই কমান্ডের জন্য একটি বিজোড় নাম বেছে নিয়েছে। আমার মনে মনে তাদের "ইনস্টল এক্সটেনশন" বা "এক্সটেনশন ব্যবহার করুন" এর মতো কিছু বেছে নেওয়া উচিত ছিল।

ইনস্টলেশন যাচাই করুন

pg_extensionসিস্টেম ক্যাটালগের ক্যোয়ারী করতে এই এসকিউএল চালিয়ে আপনি এক্সটেনশনটি সফলভাবে ইনস্টল করে কাঙ্ক্ষিত ডাটাবেসে ইনস্টল করতে পারবেন :

SELECT * FROM pg_extension;

ডিফল্ট মান হিসাবে ইউআইডি

আরও তথ্যের জন্য, প্রশ্নটি দেখুন: পোস্টগ্র্রেসে ইউআইডি কলামের জন্য ডিফল্ট মান

ওল্ড ওয়ে

তথ্য ব্যবহার করে উপরের নতুন এক্সটেনশানগুলি বৈশিষ্ট্যটিকে যোগ Postgres 9.1 হয়। পূর্ববর্তী সংস্করণগুলিতে, আমাদের একটি .sQL ফাইলটিতে একটি স্ক্রিপ্ট খুঁজতে এবং চালাতে হয়েছিল । এক্সটেনশানগুলির বৈশিষ্ট্যটি ইনস্টলেশনটি সহজ করার জন্য যুক্ত করা হয়েছিল, এক্সটেনশনের ব্যবহারকারীর / গ্রাহকের পক্ষ থেকে কম কাজের জন্য কোনও এক্সটেনশনের স্রষ্টার জন্য আরও কিছু কাজ করা বাণিজ্য করে। আরও আলোচনার জন্য আমার ব্লগ পোস্ট দেখুন।

ইউআইডি-র প্রকারগুলি

যাইহোক, প্রশ্নের কোডটি ফাংশনটিকে কল করে uuid_generate_v4()। এটি সংস্করণ 4 হিসাবে পরিচিত এমন একটি জেনারেট তৈরি করে যেখানে প্রায় 128 বিটগুলির মধ্যে প্রায় সমস্ত এলোমেলোভাবে উত্পন্ন হয়। সারিগুলির ছোট সেটগুলিতে সীমিত ব্যবহারের জন্য এটি সূক্ষ্ম হলেও, আপনি যদি সংঘর্ষের কোনও সম্ভাবনা কার্যত মুছে ফেলতে চান তবে ইউইউডি-র আর একটি "সংস্করণ" ব্যবহার করুন।

উদাহরণস্বরূপ, মূল সংস্করণ 1 হোস্ট কম্পিউটারের ম্যাক ঠিকানাটিকে বর্তমান তারিখ-সময় এবং একটি স্বেচ্ছাসেবী সংখ্যার সাথে একত্রিত করে , সংঘর্ষের সম্ভাবনাটি কার্যকরীভাবে শূন্য।

আরও আলোচনার জন্য, সম্পর্কিত প্রশ্নে আমার উত্তর দেখুন ।


1
আপনি CREATE EXTENSION IF NOT EXISTS ...যদি নিশ্চিত না হন এবং যাচাই করতে না চান তবে আপনি এটিও ব্যবহার করতে পারেন (যেমন কোনও স্ক্রিপ্টে)
উয়ে অলনার

2
সংস্করণ 4 ইউআইডিগুলি প্রায় কোনও আকারের ডেটা সেটের জন্য সূক্ষ্ম, কেবল "সারিগুলির ছোট সেটগুলিতে সীমিত ব্যবহার নয়" " এমনকি সংঘর্ষের ৫০% সম্ভাবনা থাকার জন্য আপনাকে প্রায় 85 বছর ধরে (বা প্রায় 45 মিলিয়ন টেরাবাইট ডেটা, আজকের বৃহত্তম ডেটাবেজের তুলনায় কয়েক হাজার গুণ বড়) প্রতি সেকেন্ডে 1 বিলিয়ন ইউআইডি উত্পন্ন করতে হবে। আপনি এনএসএ না করলে সংস্করণ 4 কোনও উদ্দেশ্যেই ঠিক আছে। সংস্করণ 1, অন্যদিকে, ম্যাকের ঠিকানাগুলি ক্রমানুসারে বরাদ্দ করা হয়েছে (এবং প্রায়শই ছদ্মবেশী বা অনুপলব্ধ থাকে) এর ফলে ভুগেছে, এটি পরবর্তী সংস্করণ কেন চালু হয়েছিল তারই একটি অংশ।
জাজ

1
@ বেসিলবার্ক ভি 1-র সমস্যাটি সঠিকভাবে প্রয়োগ করার পরে সংঘর্ষের সম্ভাবনা নয়, এটি ভুল বাস্তবায়নের সম্ভাবনা। উইকিপিডিয়ায় যেমন লেখা আছে: "সংস্করণ 1 এবং 2 ইউআইডি'র স্বাতন্ত্র্য ... এছাড়াও কার্ড কার্ড নির্মাতারা সঠিকভাবে তাদের কার্ডগুলিতে অনন্য ম্যাক ঠিকানা নির্ধারণের উপর নির্ভর করে, যা অন্যান্য উত্পাদন প্রক্রিয়াগুলির মতো ত্রুটিযুক্ত হতে পারে" " এছাড়াও, কিছু ধারকযুক্ত বা ভার্চুয়ালাইজড পরিবেশে অন্তর্নিহিত হার্ডওয়্যার থেকে সত্যিকারের MAC ঠিকানাগুলি পাওয়া যায় না। অনেকগুলি পাত্রে যদি একই ম্যাক থাকে তবে তাদের নিজস্ব ক্লকসেক কাউন্টার থাকে তবে তাদের ভি 1 ইউআইডিগুলি সংঘর্ষে থাকতে পারে।
জাজ

1
যদিও ভিএলবার্কের দুর্বলতা আমার মন্তব্যটির মূল বিষয় নয়। আপনার মূল উত্তরটি সূচিত করে যে ভি 4 ভি 1-র চেয়ে সংঘর্ষের উচ্চতর সম্ভাবনার কারণে বড় ডেটাসেটের জন্য উপযুক্ত নয়। এটি বিভ্রান্তিকর এবং সম্ভবত মিথ্যা, যদিও ভি 1 এর সংঘর্ষের সম্ভাবনা গণনা করা শক্ত কারণ এটি এতটা বাস্তবায়ন নির্ভর।
জাজ

1
@ বাসিলবার্ক উদাহরণস্বরূপ, নোড-ইউইড প্রকল্পটি তাদের ক্লকসেক কাউন্টারগুলির একই হওয়ার সম্ভাবনা গণনা করে (যাতে দুটি প্রক্রিয়া ভি 1 ইউআইডিগুলির একই ক্রম উৎপন্ন করতে পারে) 4.6e18 তে 1 হিসাবে। এটি ক্ষুদ্র, হ্যাঁ, তবে ভি 4-তে তাত্ক্ষণিক সংঘর্ষের সম্ভাবনার চেয়ে অনেক বেশি, যা 5.3e36-তে 1 in স্পষ্টতই আপনি যতক্ষণ ভিউ 4 ইউআইডি উত্পন্ন করবেন তত বেশি সংঘর্ষ হওয়ার সম্ভাবনা রয়েছে যা ভি 1 এর ক্ষেত্রে সত্য নয়, তবে সংঘর্ষের সম্ভাবনা নোডের ভি 1 বাস্তবায়নের ছাড়িয়ে যাওয়ার আগে আপনাকে 1.52 বিলিয়ন ভি 4 ইউআইডি উত্পন্ন করতে হবে। বেশিরভাগ লোকের প্রতি টেবিলের 1.52 বিলিয়ন রেকর্ড নেই।
জাজ

61

pgcrypto প্রসার

Postgres 9.4 হিসাবে, pgcryptoমডিউলটিতে gen_random_uuid()ফাংশন অন্তর্ভুক্ত রয়েছে । এই ফাংশনটি ইউএডিউডের এলোমেলো সংখ্যা ভিত্তিক সংস্করণ 4 প্রকারের একটি উত্পন্ন করে ।

ইতিমধ্যে উপলব্ধ না থাকলে অবদানের মডিউলগুলি পান।

sudo apt-get install postgresql-contrib-9.4

pgcryptoমডিউল ব্যবহার করুন ।

CREATE EXTENSION "pgcrypto";

gen_random_uuid()ফাংশন এখন উপলব্ধ উচিত;

ব্যবহারের উদাহরণ।

INSERT INTO items VALUES( gen_random_uuid(), 54.321, 31, 'desc 1', 31.94 ) ;


মডিউলটিতে পোস্টগ্রাস ডকuuid-ossp থেকে উদ্ধৃতি ।

দ্রষ্টব্য: আপনার যদি কেবল এলোমেলোভাবে উত্পাদিত (সংস্করণ 4) ইউআইডিগুলির প্রয়োজন হয় তবে পরিবর্তে পিজক্রিপ্টো মডিউল থেকে জেন_রেন্ডম_ইউইড () ফাংশনটি ব্যবহার করার বিষয়টি বিবেচনা করুন।


3
হ্যাঁ, তবে দেখুন blog.starkandwayne.com/2015/05/23/… যেখানে তারা টুকরো টুকরো টুকরো টুকরো সম্পর্কে সতর্ক করে এবং পরিবর্তে uuid-ossp প্রস্তাব করে।
মালিক এ রুমী


তবে পোস্টগ্রিসের সর্বশেষ সংস্করণে ক্লাস্টারযুক্ত সূচি রয়েছে, উপরের মন্তব্যে পোস্টটিকে লিঙ্কযুক্ত এবং
অনিবার্য করে তুলেছে

1
@MichaelGoldshteyn: না, Postgres নেই না (Postgres 12 এর হিসাবে) ক্লাস্টার আছে ইনডেক্স
a_horse_with_no_name

3
ALTER TABLE table_name ALTER COLUMN id SET DEFAULT uuid_in((md5((random())::text))::cstring);

@ জুজেলের উত্তর পড়ার পরে, আমি উপরের কোডটি কলাম আইডির ডিফল্ট মান হিসাবে ব্যবহার করেছি এবং এটি ঠিকঠাক কাজ করছে।


1

আসন্ন পোস্টগ্রিএসকিউএল 13 কোনও এক্সটেনশান সক্ষম করার প্রয়োজন ছাড়াই নেটিভ Gen_random_uuid () সমর্থন করবে :

পোস্টগ্রিএসকিউএল একটি ইউআইডি উত্পন্ন করার জন্য একটি ফাংশন অন্তর্ভুক্ত করে:

gen_random_uuid ()  uuid

এই ফাংশনটি একটি সংস্করণ 4 (এলোমেলো) ইউইউডি দেয়। এটি ইউআইডির সর্বাধিক ব্যবহৃত ধরণের এবং বেশিরভাগ অ্যাপ্লিকেশনগুলির জন্য উপযুক্ত।

ডিবি <> ফিডাল ডেমো

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.