[英]postgresql 10 date range contraint
我想在postgresql 10中設置日期范圍約束。在postgresql 9.6中,此方法有效:
CREATE TABLE project_lines (
id SERIAL PRIMARY KEY,
project_id INTEGER NOT NULL REFERENCES projects(id),
description VARCHAR(200) NOT NULL,
start_time TIMESTAMP NOT NULL,
end_time TIMESTAMP CHECK(end_time > start_time),
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
CONSTRAINT overlapping_times EXCLUDE USING GIST(
project_id WITH =,
tstzrange(start_time, COALESCE(end_time, 'infinity')) WITH &&
)
);
但是在PostgreSQL 10中,我得到這個錯誤:
functions in index expression must be marked IMMUTABLE
如何使該約束起作用?
start_time
和end_time
列的類型為TIMESTAMP
,而tstzrange
期望的是TIMESTAMPTZ
(帶有時區)。 顯然,這種轉換是自動發生的,但它不被認為是“不可改變的”。
在文檔https://www.postgresql.org/docs/10/static/xfunc-volatility.html說
一個常見的錯誤是標記的函數IMMUTABLE當其結果取決於配置參數。 例如,一個操作時間戳的函數可能有依賴於timezone設置的結果。 出於安全考慮,這樣的函數應該標記為穩定。
你或許應該使用tsrange
代替,或顯式轉換與時區時間戳(在不依賴於服務器設置的方式):
tstzrange(start_time at time zone 'utc', COALESCE(end_time at time zone 'utc', 'infinity')) WITH &&
我不知道是什么版本之間改變了,雖然(我也得到了同樣的錯誤消息9.6.6)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.