2011-02-15 7 views
6

मुझे आश्चर्य है कि ये सभी बिल्कुल वही हैं या यदि कुछ अंतर है।पोस्टग्रेस में प्राथमिक कुंजी को परिभाषित करने के तरीके में कोई अंतर?

विधि 1:

CREATE TABLE testtable 
(
    id serial, 
    title character varying, 
    CONSTRAINT id PRIMARY KEY (id) 
); 

विधि: 2

CREATE TABLE testtable 
(
    id serial PRIMARY KEY, 
    title character varying, 
); 

विधि 3:

CREATE TABLE testtable 
(
    id integer PRIMARY KEY, 
    title character varying, 
); 

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

ALTER SEQUENCE testtable_id_seq OWNED BY testtable.id; 

अद्यतन: कि एक कच्चे का उपयोग करके मैं वेब पर कुछ कहने पाया अनुक्रम आप प्राथमिक कुंजी के लिए स्मृति आवंटित कर सकते हैं जो आपको मदद करता है यदि आप पी अगले मिनट में कई हज़ार आवेषण करने पर लैन।

+0

मुझे जो अजीब लगता है वह यह है कि आपने कोई टेबल नहीं बनाया है और फिर परीक्षण उद्देश्यों के लिए प्राथमिक बाधा उत्पन्न करें (उदाहरण के लिए 'तालिका बनाएं (...);', 'वैकल्पिक तालिका जोड़ें ...')। – vol7ron

उत्तर

5

इसे आज़माएं और देखें; अनुगामी को दूर "," दूसरे और तीसरे पर "अलग" के बाद तो वे चलाते हैं, उनमें से प्रत्येक पर अमल करें, तो कार्य करें:

\d testtable 
हर एक के बाद

और आप देख सकते हैं क्या होता है। फिर टेबल छोड़ें और अगले पर जाएं। यह इस तरह दिखेगा:

Column |  Type  |      Modifiers       
--------+-------------------+-------------------------------------------------------- 
id  | integer   | not null default nextval('testtable_id_seq'::regclass) 
title | character varying | 
Indexes: 
    "id" PRIMARY KEY, btree (id) 

Column |  Type  |      Modifiers       
--------+-------------------+-------------------------------------------------------- 
id  | integer   | not null default nextval('testtable_id_seq'::regclass) 
title | character varying | 
Indexes: 
    "testtable_pkey" PRIMARY KEY, btree (id) 

Column |  Type  | Modifiers 
--------+-------------------+----------- 
id  | integer   | not null 
title | character varying | 
Indexes: 
    "testtable_pkey" PRIMARY KEY, btree (id) 

पहला और दूसरा लगभग समान है, सिवाय प्राथमिक कुंजी को अलग-अलग नाम दिया गया है। तीसरे में, डेटाबेस में डालने पर अनुक्रम अब भर नहीं जाता है। आपको पहले अनुक्रम बनाना होगा, फिर इस तरह की तालिका बनाएं:

CREATE TABLE testtable 
(
    id integer PRIMARY KEY DEFAULT nextval('testtable_id_seq'), 
    title character varying 
); 

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

3

विधि 1 और विधि 2.

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

+2

'स्वामित्व वाले' कथन के कारण अनुक्रम 3 में अनुक्रम भी छोड़ा जाएगा। वास्तव में –

+0

। मैंने इसे अनदेखा किया। –

संबंधित मुद्दे