PostgreSQL এ কীভাবে অটো ইনক্রিমেন্ট প্রাথমিক কী সেট করবেন?


259

আমার 22 টি কলাম সহ PostgreSQL এ একটি টেবিল রয়েছে এবং আমি একটি স্বয়ংবৃদ্ধি প্রাথমিক কী যুক্ত করতে চাই।

আমি idবিগসারিয়াল টাইপের নামে একটি কলাম তৈরি করার চেষ্টা করেছি কিন্তু প্যাগডমিন একটি ত্রুটি দিয়ে সাড়া দিয়েছিল:

ERROR: sequence must have same owner as table it is linked to.

কেউ কি এই সমস্যাটি ঠিক করতে জানেন? আমি কীভাবে পোস্টগ্রেএসকিউএলএ আবার টেবিলটি পুনরায় সরিয়ে না নিয়ে একটি স্বয়ংক্রিয় বাড়ানোর প্রাথমিক কী তৈরি করতে যুক্ত করব?

উত্তর:


292

এই আদেশটি ব্যবহার করে দেখুন:

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

আপনি যে টেবিলটি তৈরি করেছেন ঠিক একই ডিবি-ব্যবহারকারীর সাথে এটি ব্যবহার করে দেখুন।


75
(এখানে কীটি একটি সিরিয়াল বা বিগ্যাসিরিয়াল ডাটা টাইপ ব্যবহার করা হবে যা দৃশ্যের পিছনে একটি সিকোয়েন্স তৈরি করে এবং বর্ধিতকরণ / সন্নিবেশকালে এটি ব্যবহার করে)
রোজারডপ্যাক

16
এবং আপনি যদি এটি অন্য কোনও টেবিল থেকে উল্লেখ করতে চান তবে পূর্ণসংখ্যা বা বিগিন্ট ব্যবহার করুন
ওয়ার্ড

2
@ সতীশকিলারি: হ্যাঁ, সিনট্যাক্সটি হ'ল ALTER TABLE mytable ADD PRIMARY KEY (column);। Postgresql চেক করবে যে কলামটিতে কোনও NULL নেই।
এএইচ

3
প্যাগএডমিনে এই ত্রুটিটি পাওয়া 4.. উভয়ই bigserialএবং serialএকই ত্রুটিটি দিচ্ছেন:ERROR: syntax error at or near "BIGSERIAL"
আদি

5
বিগসিরিয়াল বা সিরিয়াল ব্যবহার করে সিনট্যাক্স ত্রুটিও পাওয়া যাচ্ছে। এর জন্য কি কোনও ন্যূনতম পোস্টগ্র্যাস্কিল ভেরিওন আছে?
dacDave

251

পোস্টগ্রেস্কলিতে স্বয়ংক্রিয় বৃদ্ধির প্রাথমিক কী:

পদক্ষেপ 1, আপনার টেবিলটি তৈরি করুন:

CREATE TABLE epictable
(
    mytable_key    serial primary key,
    moobars        VARCHAR(40) not null,
    foobars        DATE
);

পদক্ষেপ 2, এর মতো আপনার টেবিলের মধ্যে মানগুলি সন্নিবেশ করান, লক্ষ্য করুন যে mytable_key প্রথম প্যারামিটার তালিকায় নির্দিষ্ট করা হয়নি, এটি ডিফল্ট ক্রমটি স্ব-সংযোজনের কারণ হয়ে থাকে।

insert into epictable(moobars,foobars) values('delicious moobars','2012-05-01')
insert into epictable(moobars,foobars) values('worldwide interblag','2012-05-02')

পদক্ষেপ 3, আপনার টেবিল থেকে * নির্বাচন করুন:

el@voyager$ psql -U pgadmin -d kurz_prod -c "select * from epictable"

পদক্ষেপ 4, আউটপুট ব্যাখ্যা:

mytable_key  |        moobars        |  foobars   
-------------+-----------------------+------------
           1 | delicious moobars     | 2012-05-01
           2 | world wide interblags | 2012-05-02
(2 rows)

দেখুন যে mytable_key কলামটি স্বয়ংক্রিয়ভাবে বৃদ্ধি পেয়েছে।

ProTip:

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


21
একটি ছোট্ট নিতপিক, পর্দার আড়ালে একটি চিত্র SERIALতৈরি করে sequence: postgresql.org/docs/9.2/static/…
carbocation

1
কোনও নতুন কলাম যুক্ত না করে কোনও টেবিলে প্রাথমিক কী (বিদ্যমান কলাম) তৈরি করা সম্ভব
সতীশ কিলারী

একটি বিদেশী কী thing_id int references epictable(mytable_key)কাজের সাথে ঘোষিত হবে ?

36

কাস্টম সিকোয়েন্স ব্যবহার করে পোস্টগ্রেস্কেএলে একটি স্বয়ংক্রিয় বাড়ানোর প্রাথমিক কী তৈরি করুন:

পদক্ষেপ 1, আপনার ক্রম তৈরি করুন:

create sequence splog_adfarm_seq
    start 1
    increment 1
    NO MAXVALUE
    CACHE 1;
ALTER TABLE fact_stock_data_detail_seq
OWNER TO pgadmin;

পদক্ষেপ 2, আপনার টেবিলটি তৈরি করুন

CREATE TABLE splog_adfarm
(
    splog_key    INT unique not null,
    splog_value  VARCHAR(100) not null
);

পদক্ষেপ 3, আপনার টেবিল .োকান

insert into splog_adfarm values (
    nextval('splog_adfarm_seq'), 
    'Is your family tree a directed acyclic graph?'
);

insert into splog_adfarm values (
    nextval('splog_adfarm_seq'), 
    'Will the smart cookies catch the crumb?  Find out now!'
);

পদক্ষেপ 4, সারিগুলি পর্যবেক্ষণ করুন

el@defiant ~ $ psql -U pgadmin -d kurz_prod -c "select * from splog_adfarm"

splog_key |                            splog_value                             
----------+--------------------------------------------------------------------
        1 | Is your family tree a directed acyclic graph?
        2 | Will the smart cookies catch the crumb?  Find out now!
(3 rows)

দুটি সারিটির কীগুলি রয়েছে যা 1 থেকে শুরু হয় এবং ক্রম দ্বারা সংজ্ঞায়িত হিসাবে 1 দ্বারা বর্ধিত হয়।

বোনাস এলিট প্রোটিপ:

প্রোগ্রামাররা টাইপিংকে ঘৃণা করে এবং টাইপ nextval('splog_adfarm_seq')করা বিরক্তিকর। DEFAULTপরিবর্তে আপনি এই পরামিতিটির জন্য টাইপ করতে পারেন :

insert into splog_adfarm values (
    DEFAULT, 
    'Sufficient intelligence to outwit a thimble.'
);

উপরের কাজ করার জন্য, আপনাকে splog_adfarm টেবিলের সেই কী কলামটির জন্য একটি ডিফল্ট মান নির্ধারণ করতে হবে। যা সুন্দর।


2
কাস্টম সিকোয়েন্সগুলির সুবিধা কী কী? সম্ভবত, সুরক্ষা?
লিও লোপোল্ড হার্টজ 준영

1
@ ম্যাসি একটি কাস্টম সিকোয়েন্সের ব্যবহার হ'ল মাস্টার-মাস্টার প্রতিলিপিটিকে সহজতর করা - এটি কার্যকর হবে যদি দুটি ডেটা-সেন্টারের মধ্যে ডেটা লিঙ্কটি ভাঙা হয় - যা বিভিন্ন আইডি সহ উভয় সার্ভারে রেকর্ড তৈরি করতে দেয়, যা তারপরে পৃথক লোকেশনগুলিতে উত্পন্ন আইডির রাখার সময় ডাটাবেসগুলি ব্যাক আপ করতে সহজ করে তোলে।
ভিনসেন্ট ম্যাকনাব

16

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

1) প্রথমে আপনার টেবিলের জন্য একটি প্রাথমিক কী আছে তা নিশ্চিত করা দরকার। প্রাইমারি কী এর ডেটা টাইপ বিগিন্ট বা স্মলিন্টে রাখুন। (আমি বিগিন্ট ব্যবহার করেছি, অন্য উত্তরগুলিতে উল্লিখিত হিসাবে সিরিয়াল নামক একটি ডেটাটাইপ খুঁজে পাইনি)

2) তারপরে সিকোয়েন্সে ডান ক্লিক করে একটি সিকোয়েন্স যুক্ত করুন> নতুন সিকোয়েন্স যুক্ত করুন । টেবিলে কোনও ডেটা না থাকলে ক্রমটি যেমন রয়েছে তেমন ছেড়ে দিন, কোনও পরিবর্তন করবেন না। শুধু এটি সংরক্ষণ করুন। যদি বিদ্যমান ডেটা থাকে তবে নীচের মত সংজ্ঞা ট্যাবে বর্তমান মূল মানটিতে প্রাথমিক কী কলামে সর্বশেষ বা সর্বোচ্চ মান যুক্ত করুন। এখানে চিত্র বর্ণনা লিখুন

3) অবশেষে, nextval('your_sequence_name'::regclass)আপনার প্রাথমিক কীতে নীচের মত দেখাচ্ছে ডিফল্ট মানটিতে লাইনটি যুক্ত করুন ।

এখানে চিত্র বর্ণনা লিখুন অনুক্রমের নামটি এখানে সঠিক কিনা তা নিশ্চিত করুন। এটি সমস্ত এবং অটো বর্ধনের কাজ করা উচিত।


9

আপনি যদি সিকোয়েন্সে নম্বরগুলি ব্যবহার করতে চান তবে এর মতো কিছু দিয়ে একটি নতুন ক্রম সংজ্ঞায়িত করুন

CREATE SEQUENCE public.your_sequence
    INCREMENT 1
    START 1
    MINVALUE 1
;

এবং তারপরে আইডির ক্রমটি ব্যবহার করতে টেবিলটি পরিবর্তন করুন:

ALTER TABLE ONLY table ALTER COLUMN id SET DEFAULT nextval('your_sequence'::regclass);

আমাকে কি প্রতিটি টেবিলের জন্য একটি নতুন ক্রম তৈরি করতে হবে?
ভারত ছাবরা

আপনি বিভিন্ন টেবিলের জন্য একই ক্রম ভাগ করতে পারেন, তবে প্রতিটি সারণীতে প্রতিটি রেকর্ডের জন্য ক্রমটি বাড়বে।
অ্যাকারুচি

1

পোস্টগ্র্রেএসকিউএল-তে প্রাথমিক কীটি সফলভাবে স্বয়ংক্রিয়-বর্ধনের জন্য আমি নিম্নলিখিত স্ক্রিপ্টটি চেষ্টা করেছি।

CREATE SEQUENCE dummy_id_seq
    START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;

CREATE table dummyTable (
    id bigint DEFAULT nextval('dummy_id_seq'::regclass) NOT NULL,
    name character varying(50)
);

সম্পাদনা করুন:

CREATE table dummyTable (
    id SERIAL NOT NULL,
    name character varying(50)
)

সিরিয়াল কীওয়ার্ড স্বয়ংক্রিয়ভাবে সম্পর্কিত কলামের জন্য একটি ক্রম তৈরি করে।


যদিও আপনি একটি সিক্যুয়েন্সের জন্য আপনি যেমন করেন তেমন একটি সিরিয়াল রিসেট করতে পারেন?
thoroc

1
হ্যাঁ, আমি ALTER SEQUENCE dummytable_id_seq RESTART WITH 1;এবং এটির কার্যকারিতা পরীক্ষা করেছি have
আসাদ শাকিল

0

এই প্রশ্নের উত্তর দিতে হয়তো আমি কিছুটা দেরি করেছি, তবে আমি আমার কাজটিতে এই বিষয়ে কাজ করছি :)

আমি কলাম 'a_code' = সি 1, সি 2, সি 3, সি 4 লিখতে চেয়েছিলাম ...

প্রথমত আমি নাম ref_idএবং প্রকার সহ একটি কলাম খুললাম serial। তারপরে আমি এই আদেশটি দিয়ে আমার সমস্যাটি সমাধান করেছি:

update myschema.mytable set a_code=cast('c'||"ref_id" as text) 

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