我有一個包含 PostgreSQL 資料庫的 docker 容器。然后應用程式連接到資料庫。在資料庫中,我有一個表定義為:
CREATE TABLE IF NOT EXISTS configuration (
id SERIAL PRIMARY KEY,
board BIGINT NOT NULL REFERENCES boards ( id ),
date_time decimal(20,0) NOT NULL,
version INTEGER NOT NULL,
data TEXT NOT NULL,
UNIQUE(board, date_time, version, data)
);
我沒有明確創建與該表關聯的任何索引或任何其他元物件。
該應用程式過去可以毫無問題地寫入此表,但現在我收到以下錯誤:
Failure during 'insert_configuration_record': ERROR: index row size 5992 exceeds btree version 4 maximum 2704 for index "configuration_board_date_time_version_data_key"
DETAIL: Index row references tuple (2,12) in relation "configuration".
HINT: Values larger than 1/3 of a buffer page cannot be indexed.
Consider a function index of an MD5 hash of the value, or use full text indexing.
當我重建 docker 容器時,PostgreSQL 版本可能在某個時候發生了變化,但我沒有看到任何拒絕從持久存盤加載資料庫或要求我升級它的訊息。當前資料庫版本是(PostgreSQL) 12.9 (Ubuntu 12.9-0ubuntu0.20.04.1).
以前我寫的資料可能很短,沒有達到限制。
如何使用“值的 MD5 哈希的函式索引”來避免這個問題?
uj5u.com熱心網友回復:
如果您之前使用相同的資料具有唯一約束,那么您必須構建 PostgreSQL 的塊大小大于默認的 8kB。
無論如何,你應該按照提示告訴你的去做,而不是唯一約束創建一個唯一索引:
CREATE UNIQUE INDEX ON configuration (
board,
date_time,
version,
md5(data)
);
您不能將此索引轉換為唯一約束,因為這樣的約束只能在普通列上定義,而不能在運算式上定義。但是,行為將與約束相同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/439767.html
標籤:PostgreSQL
上一篇:如何使用.sql腳本遷移資料?
