PostgreSQL: คุณสามารถสร้างดัชนีในนิยาม CREATE TABLE ได้หรือไม่?


105

ฉันต้องการเพิ่มดัชนีให้กับบางคอลัมน์ในตารางในการสร้าง มีวิธีเพิ่มเข้าไปในนิยาม CREATE TABLE หรือไม่หรือต้องเพิ่มในภายหลังด้วยแบบสอบถามอื่น

CREATE INDEX reply_user_id ON reply USING btree (user_id);

คำตอบ:


120

ดูเหมือนจะไม่มีวิธีใดในการระบุดัชนีในCREATE TABLEไวยากรณ์ อย่างไรก็ตาม PostgreSQL สร้างดัชนีสำหรับข้อ จำกัด เฉพาะและคีย์หลักตามค่าเริ่มต้นดังที่อธิบายไว้ในบันทึกย่อนี้ :

PostgreSQL จะสร้างดัชนีสำหรับข้อ จำกัด ที่ไม่ซ้ำกันและข้อ จำกัด ของคีย์หลักโดยอัตโนมัติเพื่อบังคับใช้ความเป็นเอกลักษณ์

นอกเหนือจากนั้นหากคุณต้องการดัชนีที่ไม่ซ้ำกันคุณจะต้องสร้างขึ้นเองในCREATE INDEXแบบสอบถามแยกต่างหาก


ขอบคุณฉันไม่รู้เกี่ยวกับข้อ จำกัด เฉพาะในการสร้างดัชนี
Xeoncross

โปรดทราบว่า PostgreSQL รองรับการอัปเดตสคีมาทรานแซคชันซึ่งเป็นความคิดที่ดีที่จะเริ่มต้น / คอมมิตรอบ ๆ สร้างตารางและสร้างงบดัชนีหากคุณต้องการให้การสร้างตารางสุทธิโดยรวมสำเร็จหรือล้มเหลวโดยรวม
mindplay.dk

22

ไม่

แต่คุณสามารถสร้างuniqueดัชนีในการสร้าง แต่นั่นเป็นเพราะพวกเขาจะจัดว่าเป็นข้อ จำกัด คุณไม่สามารถสร้างดัชนี "ทั่วไป"


6

Peter Krauss กำลังมองหาคำตอบที่เป็นที่ยอมรับ:

มี MODERN SYNTAX (ปี 2020) ดังนั้นโปรดอธิบายและแสดงตัวอย่างเข้ากันได้กับ postgresql.org/docs/current/sql-createtable.html

คุณกำลังค้นหานิยามดัชนีแบบอินไลน์ซึ่งใช้ไม่ได้สำหรับ PostgreSQL จนถึงเวอร์ชันปัจจุบัน 12 ยกเว้นข้อ จำกัด UNIQUE / PRIMARY KEY ที่สร้างดัชนีพื้นฐานให้คุณ

สร้างตาราง

[CONSTRAINT constraint_name] {CHECK (expression) [NO INHERIT] | UNIQUE (column_name [, ... ]) index_parameters | คีย์หลัก (column_name [, ... ]) index_parameters |


ไวยากรณ์ตัวอย่างของการกำหนดคอลัมน์แบบอินไลน์ (ที่นี่ SQL Server):

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 <> การสาธิตซอ

เหตุผลเบื้องหลังการแนะนำพวกเขาค่อนข้างน่าสนใจInline Indexes คืออะไร? โดย Phil Factor


สวัสดีแก้ไข (!) คุณสามารถเพิ่มบางอย่างเกี่ยวกับกรณีที่ซับซ้อนมากขึ้นเช่นb VARCHAR(10) NOT NULL INDEX idx_tab_b gin (b gin_trgm_ops).. จะเพิ่มพารามิเตอร์โดยไม่ใช้ชื่อคอลัมน์ซ้ำได้อย่างไร
Peter Krauss

@PeterKrauss ตัวอย่างที่ฉันให้ไว้สำหรับ SQL Server ซึ่งไม่รองรับ gin_trgm_ops
Lukasz Szozda

สวัสดี @LukaszSzozda สำหรับไวยากรณ์บางทีคุณอาจจะพยายามที่จะเปลี่ยนชนิดของความซับซ้อนใด ๆCREATE INDEX idxName ON tableName USING MethodName (fieldName optionName);ลงในไวยากรณ์ของคำนิยามดัชนีแบบอินไลน์ PS: คำถามนี้เกี่ยวกับ PostgreSQL ไม่ใช่ Microsoft-SQL-Server (ดูแท็ก)
Peter Krauss

@PeterKrauss ฉันรู้ดีว่าคำถามนี้เกี่ยวกับ PostgreSQL ฉันเพิ่งตั้งชื่อฟีเจอร์นี้ให้คุณและแสดงตัวอย่างว่าฟีเจอร์นี้จะเป็นอย่างไร หวังว่า RDBMS จะรองรับดัชนี inlinde ในอนาคต :)
Lukasz Szozda
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.