我有一張表,我有一個無法通過id找到的行。如果我繞PK索引行,找到該行。如果我刪除索引,則找到該行。如果我添加一個新的索引,找不到行。如何重建損壞的postgres主鍵索引
d5toqvrtbm8bbu=> SELECT id, created_at FROM widgets WHERE id = 1155301;
id | created_at
---------+----------------------------
1155301 | 2014-01-10 02:59:47.856214
(1 row)
d5toqvrtbm8bbu=> CREATE UNIQUE INDEX widgets_pkey ON widgets(id);
CREATE INDEX
d5toqvrtbm8bbu=> SELECT id, created_at FROM widgets WHERE id = 1155301;
id | created_at
----+------------
(0 rows)
d5toqvrtbm8bbu=> SELECT id, created_at FROM widgets WHERE id - 1 + 1 = 1155301;
id | created_at
---------+----------------------------
1155301 | 2014-01-10 02:59:47.856214
(1 row)
d5toqvrtbm8bbu=> DROP INDEX widgets_pkey;
DROP INDEX
d5toqvrtbm8bbu=> SELECT id, created_at FROM widgets WHERE id = 1155301;
id | created_at
---------+----------------------------
1155301 | 2014-01-10 02:59:47.856214
(1 row)
d5toqvrtbm8bbu=> CREATE UNIQUE INDEX widgets_pkey ON widgets(id);
CREATE INDEX
d5toqvrtbm8bbu=> SELECT id, created_at FROM widgets WHERE id = 1155301;
id | created_at
----+------------
(0 rows)
這是對的Postgres 9.3
有什麼建議?
這看起來很奇怪。您應該將其發佈到Postgres郵件列表。 –
看起來好像索引一旦創建就被破壞。這個'id'列的類型是什麼,你的postgres安裝中是否有自定義代碼? –
請爲表'widgets'顯示'd +',並且爲-index和without-index計劃顯示'explain'。 'id'是一個'integer' /'bigint'嗎?或者是其他東西?什麼是確切的'SELECT版本()'?你可以發佈一個自包含的數據庫轉儲來演示這個問題。 –