PostgreSQL में ऑटो इंक्रीमेंट प्राइमरी कुंजी कैसे सेट करें?


259

मेरे पास 22 स्तंभों के साथ PostgreSQL में एक तालिका है, और मैं एक ऑटो वेतन वृद्धि प्राथमिक कुंजी जोड़ना चाहता हूं।

मैंने idBIGSERIAL नामक एक कॉलम बनाने की कोशिश की, लेकिन pgadmin ने एक त्रुटि के साथ जवाब दिया:

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

क्या किसी को पता है कि इस मुद्दे को कैसे ठीक किया जाए? मैं दोबारा तालिका बनाए बगैर PostgreSQL में एक ऑटो-इन्क्रिमेंटिंग प्राथमिक कुंजी कैसे बनाऊं?

जवाबों:


292

इस आदेश का प्रयास करें:

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

इसे उसी DB-user के साथ आज़माएं, जैसा आपने टेबल बनाया है।


75
(यहां कुंजी एक सीरियल या बिग डेटा प्रकार का उपयोग करना है, जो दृश्यों और वेतन वृद्धि के पीछे एक अनुक्रम बनाता है / इसे सम्मिलित समय पर उपयोग करता है)
रॉगरडैक

16
और यदि आप इसे किसी अन्य तालिका से संदर्भित करना चाहते हैं, तो पूर्णांक या बिगिन्ट का उपयोग करें
वार्ड

2
@ सतीशकीलारी: हाँ, वाक्यविन्यास है ALTER TABLE mytable ADD PRIMARY KEY (column);। Postgresql जाँच करेगा कि कॉलम में कोई NULL नहीं है।
एएच

3
यह त्रुटि pgAdmin 4. में हो रही है 4. दोनों bigserialऔर serialएक ही त्रुटि दे रहे हैं:ERROR: syntax error at or near "BIGSERIAL"
adi

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 कॉलम को ऑटो इंक्रीमेंट किया गया है।

प्रो टिप:

आपको हमेशा अपनी मेज पर एक प्राथमिक कुंजी का उपयोग करना चाहिए क्योंकि पोस्टग्रेजल आंतरिक रूप से हैश तालिका संरचनाओं का उपयोग आवेषण, हटाने, अपडेट और चयन की गति बढ़ाने के लिए करता है। यदि एक प्राथमिक कुंजी कॉलम (जो अद्वितीय और गैर-शून्य होने के लिए मजबूर है) उपलब्ध है, तो इसे हैश फ़ंक्शन के लिए एक अद्वितीय बीज प्रदान करने के लिए पर निर्भर किया जा सकता है। यदि कोई प्राथमिक कुंजी स्तंभ उपलब्ध नहीं है, तो हैश फ़ंक्शन अक्षम हो जाता है क्योंकि यह कुंजी के रूप में कॉलम के कुछ अन्य सेट का चयन करता है।


21
एक मामूली नाइटपिक, पर्दे के पीछे का SERIALनिर्माण करता है sequence: postgresql.org/docs/9.2/static/…
कार्बोकेशन

1
क्या किसी भी नए कॉलम को जोड़े बिना किसी तालिका में प्राथमिक कुंजी (मौजूदा कॉलम) बनाना संभव है
satish kilari

क्या 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 से बढ़ जाती हैं, जैसा कि अनुक्रम द्वारा परिभाषित किया गया है।

बोनस अभिजात वर्ग ProTip:

प्रोग्रामर टाइपिंग से नफरत करते हैं, और टाइपिंग करना 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);

क्या मुझे हर तालिका के लिए एक नया अनुक्रम बनाना होगा?
भारत छाबड़ा

आप अलग-अलग तालिकाओं के लिए एक ही अनुक्रम साझा कर सकते हैं, लेकिन प्रत्येक तालिका में प्रत्येक रिकॉर्ड के लिए अनुक्रम बढ़ जाएगा।
acaruci

1

मैंने PostgreSQL में प्राथमिक कुंजी को सफलतापूर्वक ऑटो-इंक्रीमेंट करने के लिए निम्न स्क्रिप्ट की कोशिश की है।

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)
)

सीरियल कीवर्ड स्वचालित रूप से संबंधित कॉलम के लिए एक अनुक्रम बनाता है।


क्या आप एक अनुक्रमिक को फिर से सेट कर सकते हैं जैसे आप एक दृश्य के लिए करते हैं?
थोरोक

1
हाँ!, मैंने ALTER SEQUENCE dummytable_id_seq RESTART WITH 1;इसके साथ काम किया है।
असद शकील

0

शायद मुझे इस सवाल का जवाब देने में थोड़ी देर हो गई है, लेकिन मैं अपनी नौकरी में इस विषय पर काम कर रहा हूं :)

मैं कॉलम 'a_code' = c1, c2, c3, c4 लिखना चाहता था ...

सबसे पहले मैंने नाम ref_idऔर प्रकार के साथ एक कॉलम खोला serial। फिर मैंने इस कमांड के साथ अपनी समस्या हल की:

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

क्या किसी भी नए कॉलम को जोड़े बिना किसी तालिका में प्राथमिक कुंजी (मौजूदा कॉलम) बनाना संभव है
satish kilari
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.