2008-10-01 27 views
15

Tôi muốn tìm hiểu, với một truy vấn SQL, cho dù một chỉ mục là UNIQUE hay không. Tôi đang sử dụng SQLite 3.Làm cách nào để tìm hiểu xem chỉ mục SQLite là duy nhất? (Với SQL)

Tôi đã thử hai cách tiếp cận:

SELECT * FROM sqlite_master WHERE name = 'sqlite_autoindex_user_1' 

này trả về thông tin về chỉ số ("loại", "tên", "tbl_name", "rootpage" và "sql"). Lưu ý rằng cột sql trống khi chỉ mục được tạo tự động bởi SQLite.

PRAGMA index_info(sqlite_autoindex_user_1); 

Điều này trả về các cột trong chỉ mục ("seqno", "cid" và "name").

Bất kỳ đề xuất nào khác?

Chỉnh sửa: Ví dụ trên là dành cho chỉ mục được tạo tự động, nhưng câu hỏi của tôi là về chỉ mục nói chung. Ví dụ, tôi có thể tạo một chỉ mục với "CREATE UNIQUE INDEX index1 ON (người dùng, ngày tháng)". Có vẻ như không có lệnh SQL nào sẽ hiển thị nếu chỉ mục mới của tôi là UNIQUE hay không.

+0

Bạn có thể đưa ra ví dụ về chỉ mục được tạo tự động không phải là duy nhất không? Những cái tôi thấy luôn luôn là duy nhất. – finnw

+0

autoindex được tạo cho khóa chính, theo định nghĩa duy nhất – Noah

Trả lời

31
PRAGMA INDEX_LIST('table_name'); 

Returns một bảng có 3 cột:

  1. seq Uniqu e ID số của chỉ số
  2. name Tên của chỉ số
  3. unique cờ độc đáo (nonzero nếu UNIQUE chỉ mục.)

Sau đó chỉ cần lặp qua các hàng kết quả cho đến khi bạn nhìn thấy tên của chỉ số bạn muốn truy vấn (không may là bạn không thể có điều khoản WHERE trong tuyên bố PRAGMA.)

1

bạn có thể lập trình xây dựng câu lệnh chọn để xem liệu bất kỳ bộ nào trỏ đến nhiều hơn một hàng. Nếu bạn nhận được trở lại ba cột, foo, quầy bar và baz, tạo ra các truy vấn sau đây

select count(*) from t 
group by foo, bar, baz 
having count(*) > 1 

Nếu trả về bất kỳ hàng, chỉ số của bạn không phải là độc đáo, vì bản đồ nhiều hơn một hàng để các tuple nhất định. Nếu sqlite3 hỗ trợ có nguồn gốc bảng (tôi chưa có nhu cầu, vì vậy tôi không biết off-hand), bạn có thể làm cho điều này thậm chí ngắn gọn hơn:

select count(*) from (
    select count(*) from t 
    group by foo, bar, baz 
    having count(*) > 1 
) 

này sẽ trả về một tập kết quả hàng duy nhất, biểu thị số lượng bộ tuple trùng lặp. Nếu tích cực, chỉ mục của bạn không phải là duy nhất.

+0

Có, điều đó hoạt động trong sqlite3. – finnw

+2

Tất nhiên, điều này vẫn không cho bạn biết liệu chỉ mục có cho phép trùng lặp hay không nhưng vẫn chưa xảy ra. – finnw

+0

@finnw: ah có, bạn có một điểm tốt ở đó :) – dland

5

Kể từ noone của đưa ra một câu trả lời tốt, tôi nghĩ rằng giải pháp tốt nhất là thế này:

  • Nếu chỉ số bắt đầu với "sqlite_autoindex", đó là một chỉ số tính năng tự động tạo ra cho một cột UNIQUE đơn
  • Nếu không, tìm kiếm các từ khóa UNIQUE trong cột sql trong sqlite_master bảng, với một cái gì đó như thế này:

    SELECT * FROM sqlite_master ĐÂU type = 'index' và SQL LIKE '% UNIQUE%'

+0

rằng điểm đầu tiên không hoàn toàn đúng. Nếu chỉ mục bắt đầu bằng "sqlite_autoindex", thì chỉ mục được tạo tự động cho Khóa chính. Nhưng nếu PK là nhiều cột, thì "cột UNIQUE đơn" là không đúng sự thật. Tôi có một mặt trước của tôi ở đây là một PK tổng hợp tức là hai cột với nhau là duy nhất (nhưng một mình thì không). – MemeDeveloper

1

Bạn đang gần:

1) Nếu chỉ số bắt đầu với "sqlite_autoindex", nó là một chỉ số tính năng tự động tạo ra cho các khóa chính. Tuy nhiên, điều này sẽ nằm trong các bảng sqlite_master hoặc sqlite_temp_master tùy thuộc vào việc bảng được lập chỉ mục là tạm thời hay không.

2) Bạn cần phải xem ra cho tên bảng và cột có chứa các chuỗi unique, vì vậy bạn muốn sử dụng:

SELECT * FROM sqlite_master WHERE type = 'index' AND sql LIKE 'CREATE UNIQUE INDEX%' 

Xem tài liệu trang web sqlite trên Create Index

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