PostgreSQL: Bạn có thể tạo chỉ mục trong định nghĩa CREATE TABLE không?


105

Tôi muốn thêm chỉ mục vào một số cột trong bảng khi tạo. Có cách nào để thêm chúng vào định nghĩa TẠO BẢNG không hay tôi phải thêm chúng sau đó bằng một truy vấn khác?

CREATE INDEX reply_user_id ON reply USING btree (user_id);

Câu trả lời:


118

Dường như không có bất kỳ cách nào để chỉ định một chỉ mục trong CREATE TABLEcú pháp. Tuy nhiên, PostgreSQL không tạo chỉ mục cho các ràng buộc và khóa chính duy nhất theo mặc định, như được mô tả trong ghi chú này :

PostgreSQL tự động tạo chỉ mục cho mỗi ràng buộc duy nhất và ràng buộc khóa chính để thực thi tính duy nhất.

Ngoài ra, nếu bạn muốn một chỉ mục không phải là duy nhất, bạn sẽ cần phải tự tạo nó trong một CREATE INDEXtruy vấn riêng .


Cảm ơn, tôi không biết về ràng buộc duy nhất tạo chỉ mục.
Xeoncross

Lưu ý rằng PostgreSQL hỗ trợ cập nhật lược đồ giao dịch - bạn nên BẮT ĐẦU / CAM KẾT xung quanh các câu lệnh CREATE TABLE và CREATE INDEX, nếu bạn muốn việc tạo bảng tổng thể thành công hay thất bại.
mindplay.dk

22

Không.

Tuy nhiên, bạn có thể tạo uniquecác chỉ mục trong tạo, nhưng đó là vì chúng được phân loại là các ràng buộc . Bạn không thể tạo chỉ mục "chung".


6

Peter Krauss đang tìm kiếm một câu trả lời kinh điển:

Có một TỔNG HỢP HIỆN ĐẠI (năm 2020), vì vậy vui lòng giải thích và hiển thị các ví dụ, tương thích với postgresql.org/docs/current/sql-createtable.html

Bạn đang tìm kiếm định nghĩa chỉ mục nội tuyến , định nghĩa này không khả dụng cho PostgreSQL cho đến phiên bản hiện tại 12. Ngoại trừ ràng buộc UNIQUE / PRIMARY KEY, tạo chỉ mục cơ bản cho bạn.

TẠO BẢNG

[CONSTRAINT binding_name] {CHECK (biểu thức) [NO INHERIT] | DUY NHẤT (column_name [, ...]) index_parameters | TỪ KHÓA CHÍNH (column_name [, ...]) index_parameters |


Cú pháp mẫu của định nghĩa cột nội tuyến (tại đây 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 <> bản trình diễn fiddle

Cơ sở lý luận đằng sau việc giới thiệu chúng là khá thú vị Chỉ số nội tuyến là gì? bởi Phil Factor


Chào bạn, đã giải quyết (!). Bạn có thể thêm điều gì đó về trường hợp phức tạp hơn, ví dụ b VARCHAR(10) NOT NULL INDEX idx_tab_b gin (b gin_trgm_ops).. làm thế nào để thêm nhiều tham số hơn mà không lặp lại tên cột?
Peter Krauss

@PeterKrauss Ví dụ tôi cung cấp dành cho SQL Server không hỗ trợ gin_trgm_ops.
Lukasz Szozda

Xin chào @LukaszSzozda Về cú pháp, có lẽ bạn có thể thử chuyển bất kỳ loại phức tạp nào CREATE INDEX idxName ON tableName USING MethodName (fieldName optionName);thành cú pháp của định nghĩa chỉ mục nội tuyến . Tái bút: câu hỏi này là về PostgreSQL không phải Microsoft-SQL-Server (xem thẻ).
Peter Krauss

@PeterKrauss Tôi hoàn toàn biết rằng câu hỏi này là về PostgreSQL. Tôi chỉ cung cấp cho bạn một tên riêng của tính năng này và cho ví dụ về cách nó có thể trông như thế nào. Hãy hy vọng nhiều RDBMS sẽ hỗ trợ các chỉ số inlinde trong tương lai :)
Lukasz Szozda
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.