PostgreSQL: क्या आप क्रिएट टेबल परिभाषा में एक इंडेक्स बना सकते हैं?


105

मैं निर्माण की तालिका में कुछ स्तंभों में अनुक्रमणिका जोड़ना चाहता हूं। वहाँ उन्हें बनाने के लिए रास्ता बनाने के लिए कर रहे हैं टेबल परिभाषा या मैं उन्हें एक और क्वेरी के साथ बाद में जोड़ने के लिए है?

CREATE INDEX reply_user_id ON reply USING btree (user_id);

जवाबों:


119

CREATE TABLEवाक्य-विन्यास में किसी सूचकांक को निर्दिष्ट करने का कोई तरीका प्रतीत नहीं होता है । PostgreSQL इस नोट में वर्णित है, लेकिन डिफ़ॉल्ट रूप से अद्वितीय बाधाओं और प्राथमिक कुंजी के लिए एक सूचकांक बनाता है :

PostgreSQL स्वचालित रूप से अद्वितीयता को लागू करने के लिए प्रत्येक अद्वितीय बाधा और प्राथमिक कुंजी बाधा के लिए एक सूचकांक बनाता है।

इसके अलावा, यदि आप एक गैर-अद्वितीय सूचकांक चाहते हैं, तो आपको इसे एक अलग CREATE INDEXक्वेरी में खुद बनाना होगा ।


धन्यवाद, मैं एक सूचकांक बनाने वाले अद्वितीय बाधा के बारे में नहीं जानता था।
Xeoncross

ध्यान दें कि PostgreSQL ट्रांजेक्शनल स्कीमा अपडेट का समर्थन करता है - यदि आप एक समग्र के रूप में सफल होने या असफल होने के लिए नेट समग्र तालिका बनाना चाहते हैं, तो यह आपके क्रिएटिव और रचनात्मक कथन के आसपास BEGIN / COMMIT के लिए एक अच्छा विचार है।
mindplay.dk

22

नहीं।

हालाँकि, आप क्रिएट में uniqueइंडेक्स बना सकते हैं , लेकिन ऐसा इसलिए है क्योंकि उन्हें बाधा के रूप में वर्गीकृत किया गया है । आप "सामान्य" इंडेक्स नहीं बना सकते।


6

पीटर क्रूस एक विहित उत्तर की तलाश में है:

एक MODN SYNTAX (वर्ष 2020) हैं, इसलिए कृपया समझाएं और उदाहरण दिखाएँ, postgresql.org/docs/current/sql-createtable.html

आप इनलाइन इंडेक्स डेफिनेशन की खोज कर रहे हैं , जो वर्तमान संस्करण 12 तक पोस्टग्रेसीक्यूएल के लिए उपलब्ध नहीं है। UNIQUE / PRIMARY KEY बाधा को छोड़कर, जो आपके लिए अंतर्निहित इंडेक्स बनाता है।

तालिका बनाएं

[CONSTRAINT constraint_name] {CHECK (अभिव्यक्ति) [सं।] | UNIQUE (column_name [, ...) index_parameters | प्राथमिक कुंजी (column_name [, ...) index_parameters |


इनलाइन कॉलम परिभाषा का नमूना सिंटैक्स (यहां SQL सर्वर):

CREATE TABLE tab(
  id INT PRIMARY KEY,                            -- constraint
  c INT INDEX filtered (c) WHERE c > 10,         -- filtered index
  b VARCHAR(10) NOT NULL INDEX idx_tab_b,        -- index on column
  d VARCHAR(20) NOT NULL,
  INDEX my_index NONCLUSTERED(d)                 -- index on column as separate entry
);

db <> फिडेल डेमो

उन्हें पेश करने के पीछे तर्क काफी दिलचस्प है कि इनलाइन इंडेक्स क्या हैं? फिल फैक्टर द्वारा


हाय, हल (!)। क्या आप अधिक जटिल मामले के बारे में कुछ जोड़ सकते हैं, उदाहरण के लिए b VARCHAR(10) NOT NULL INDEX idx_tab_b gin (b gin_trgm_ops).. रिपीट कॉलम नाम के बिना अधिक पैरामीटर कैसे जोड़ें?
पीटर क्रूस

@PeterKrauss मैंने जो उदाहरण दिया है वह SQL सर्वर के लिए है जो gin_trgm_ops का समर्थन नहीं करता है।
लुकाज़ स्ज़ोज़दा

हाय @LukaszSzozda सिंटैक्स के लिए, शायद आप किसी भी तरह के कॉम्प्लेक्स CREATE INDEX idxName ON tableName USING MethodName (fieldName optionName);को इनलाइन इंडेक्स परिभाषा के सिंटैक्स में बदलने की कोशिश कर सकते हैं । पुनश्च: यह सवाल Microsoft-SQL- सर्वर नहीं (टैग देखें) PostgreSQL के बारे में है।
पीटर क्रूस

@PeterKrauss मुझे पूरी जानकारी है कि यह सवाल PostgreSQL के बारे में है। मैंने आपको इस सुविधा का उचित नाम दिया है और उदाहरण दिया है कि यह कैसा दिख सकता है। आइए आशा करते हैं कि अधिक RDBMS भविष्य में inlinde इंडेक्स का समर्थन करेंगे :)
लुकाज़ स्ज़ोज़ा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.