我想在postgresql 10中设置一个日期范围约束。
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
如何使这个约束有效?
发布于 2018-03-19 21:35:14
start_time
和end_time
列具有TIMESTAMP
类型,而tstzrange
需要TIMESTAMPTZ
(带时区)。显然,这种转换是自动发生的,但它并不被认为是“不可变的”。
https://www.postgresql.org/docs/10/static/xfunc-volatility.html的文件上说
一个常见的错误是,当函数的结果取决于配置参数时,将其标记为不可变函数。例如,操纵时间戳的函数很可能具有依赖于TimeZone设置的结果。为了安全起见,这些功能应该被标记为稳定的。
您可能应该使用tsrange
,或者使用时区显式转换为时间戳(以不依赖于服务器设置的方式):
tstzrange(start_time at time zone 'utc', COALESCE(end_time at time zone 'utc', 'infinity')) WITH &&
不过,我不知道不同版本之间发生了什么变化(我也得到了9.6.6的相同错误消息)。
https://stackoverflow.com/questions/49372093
复制相似问题