type uuid
trong câu lệnh DDL của bạn là viết tắt của SET DATA TYPE uuid
. Hướng dẫn:
varchar_pattern_ops
là lớp toán tử
sẽ được đề cập trong thông báo lỗi của bạn nếu bạn có uuid
sử dụng lớp toán tử này trong bất kỳ chỉ mục nào. Thông thường để kích hoạt các điều kiện sắp xếp, đối sánh mẫu và phạm vi nhanh hơn.
Để khắc phục, hãy loại bỏ các chỉ mục xung đột, thay đổi kiểu dữ liệu và sau đó tạo lại các chỉ mục mà không có lớp toán tử đặc biệt - if bạn vẫn cần chúng.
Tuy nhiên, một số truy vấn điển hình sẽ sử dụng varchar_pattern_ops
chỉ mục sẽ ngừng hoạt động với kiểu dữ liệu uuid
thay vì varchar
. Giống như đối sánh mẫu:
Đảm bảo cũng sửa mọi truy vấn như vậy.
@ fl0cke đã chỉ ra một câu trả lời liên quan:
Tôi đề nghị một con đường hơi khác. Sẽ rẻ hơn nếu giảm chỉ mục, thay đổi loại dữ liệu và sau đó tạo một chỉ mục mới - nếu nó vẫn hữu ích.
DROP INDEX tbl_guid_varchar_pattern_ops_idx;
ALTER TABLE tbl ALTER COLUMN guid TYPE uuid USING guid::uuid;
CREATE INDEX tbl_guid_idx ON tbl (guid);
Làm cách nào để tìm chỉ mục vi phạm?
Trong các phiên bản hiện đại của Postgres, bạn nhận được các chỉ mục hiện có cho bảng với \d tbl
trong psql.
Để có được tất cả CREATE INDEX
hoàn chỉnh câu lệnh cho bảng đã cho:
SELECT pg_get_indexdef(indexrelid) || ';' AS idx
FROM pg_index
WHERE indrelid = 'public.tbl'::regclass; -- optionally schema-qualified
Để chỉ lấy những cái bằng cách sử dụng varchar_pattern_ops
:
SELECT pg_get_indexdef(i.indexrelid) || ';' AS idx
FROM pg_index i
JOIN pg_opclass o ON o.oid = ANY (i.indclass)
WHERE i.indrelid = 'public.big'::regclass
AND o.opcname = 'varchar_pattern_ops';
Chi tiết:
- Sao chép chỉ mục từ bảng này sang bảng khác
- Làm cách nào để xóa tất cả các chỉ mục của bảng trong Postgres?