我创建了一个不可变函数,如下所示:
CREATE OR REPLACE FUNCTION GetCurrentDate ()
RETURNS
DATE
AS
$p$
BEGIN
RETURN CURRENT_TIMESTAMP::DATE;
END;
$p$ LANGUAGE plpgsql IMMUTABLE SECURITY DEFINER;
我在 UNIQUE INDEX 的 WHERE 子句中使用它,例如:
CREATE UNIQUE INDEX PersonPhoness_UK_PhoneNo_CountryID ON person_phones (phone_no, country_id)
WHERE GetCurrentDate() BETWEEN effective_from_date AND effective_till_date;
添加另一条记录时,此唯一索引有时不会捕获重复项。新添加记录的 effective_from_dt 始终为 CURRENT_DATE。但是,如果我将函数更改为:
CREATE OR REPLACE FUNCTION GetCurrentDate ()
RETURNS
DATE
AS
$p$
BEGIN
RETURN CURRENT_DATE;
END;
它有效。所以我想了解其中的区别。
第一个版本有点慢:
CURRENT_TIMESTAMP
伪函数没有任何影响,所以它是无用的。不过虽然没什么用,但是却有一个开销。也许如果函数的所有者与应用程序用户是同一用户,则上下文不会更改。但出于安全原因,这是错误的配置。所以两个函数返回相同的结果,但首先做了一些无用的操作,然后应该会慢一点。