2014-12-05 13 views
9

Trong Microsoft SQL Server và MySQL, tên chỉ mục cần phải duy nhất trong bảng, nhưng không phải trong cơ sở dữ liệu. Đây không phải là trường hợp của PostgreSQL.Các tên chỉ mục Postgres ở mức nào cần phải là duy nhất?

Đây là những gì tôi đang làm: Tôi đã tạo bản sao của một bảng bằng cách sử dụng CREATE TABLE new_table AS SELECT * FROM old_table v.v ... và cần phải tạo lại các chỉ mục.

Chạy một truy vấn như CREATE INDEX idx_column_name ON new_table USING GIST(column_name) gây ERROR: relation "idx_column_name" already exists

gì đang xảy ra ở đây?

+1

tên là duy nhất trong giản đồ. (schema: = không gian tên cho các bảng và các ràng buộc (và các hàm, vv) (mặc dù các ràng buộc lược đồ chéo được cho phép)) – wildplasser

+0

BTW: đây có phải là thông báo lỗi thực tế không? ('idx_column_name' khác với' idx_pickup_geom') – wildplasser

+2

Các chỉ mục chia sẻ cùng một không gian tên (: = lược đồ) với các bảng. (chỉ mục: = bảng). Bạn sẽ cần phải phát minh ra một tên khác (hoặc bỏ qua nó: hệ thống có thể phát minh ra tên cho bạn) – wildplasser

Trả lời

14

Chỉ mục và bảng (và quan điểm, và trình tự, và ...) được lưu trữ trong danh mục pg_class, và họ đang độc đáo mỗi giản đồ do một chìa khóa duy nhất trên đó:

# \d pg_class 
     Table "pg_catalog.pg_class" 
    Column  | Type | Modifiers 
----------------+-----------+----------- 
relname  | name  | not null 
relnamespace | oid  | not null 
... 
Indexes: 
    "pg_class_oid_index" UNIQUE, btree (oid) 
    "pg_class_relname_nsp_index" UNIQUE, btree (relname, relnamespace) 

mỗi @ comment của wildplasser, bạn có thể bỏ qua tên khi tạo chỉ mục, và PG sẽ gán một tên duy nhất một cách tự động.

5
  • Tên là duy nhất trong giản đồ. Một lược đồ về cơ bản là một không gian tên cho {tables, constraints}, (và các chỉ mục, các hàm, v.v.).
  • ràng buộc lược đồ chéo được cho phép
  • Chỉ mục chia sẻ không gian tên của chúng ((= = lược đồ) với bảng. (đối với Postgres: chỉ số một bảng).
  • (IIRC) tiêu chuẩn SQL không xác định chỉ mục; sử dụng các ràng buộc bất cứ khi nào bạn có thể (Chỉ số GIST trong câu hỏi có thể là ngoại lệ)
  • Ergo Bạn sẽ cần phải phát minh ra một tên khác.
  • hoặc bỏ qua: hệ thống có thể phát minh ra tên nếu bạn không cung cấp.
  • Nhược điểm của việc này: bạn có thể tạo các chỉ số multipe với cùng định nghĩa (tên của họ sẽ được hậu tố với _1, _2, IIRC)
+0

Nó không phải về không gian tên (: = lược đồ). Nếu bộ nhớ phục vụ, đó là về các ràng buộc trên 'pg_class'. :-) –

+0

IIRC (-;), các danh mục chỉ sử dụng ID số. (là PK) không gian tên/lớp là phụ thuộc vào chức năng. Các khóa (ứng viên) khác có thể tồn tại, chẳng hạn như {schema, table}, hoặc thậm chí {objecttype, schema, name} – wildplasser

+0

@wildplasser Để postgresql một chỉ mục là một quan hệ, ** not ** a table. Mối quan hệ là "hầu hết mọi thứ có cột hoặc tương tự như bảng" (từ http://www.postgresql.org/docs/9.3/static/catalog-pg-class.html doc), bao gồm các chỉ mục, lượt xem , chuỗi, v.v. – Patrick

Các vấn đề liên quan