【发布时间】:2015-12-22 02:09:49
【问题描述】:
查看this answer后,我创建了以下自定义运算符:
CREATE OR REPLACE FUNCTION is_not_distinct_from(
ANYELEMENT,
ANYELEMENT
)
RETURNS BOOLEAN AS
$$
SELECT $1 IS NOT DISTINCT FROM $2;
$$
LANGUAGE sql
IMMUTABLE;
CREATE OPERATOR =!= (
PROCEDURE = is_not_distinct_from(anyelement,anyelement),
LEFTARG = anyelement,
RIGHTARG = anyelement,
COMMUTATOR = =!=,
NEGATOR = <!>
);
CREATE OR REPLACE FUNCTION is_distinct_from(
ANYELEMENT,
ANYELEMENT
)
RETURNS BOOLEAN AS
$$
SELECT $1 IS DISTINCT FROM $2;
$$
LANGUAGE sql
IMMUTABLE;
CREATE OPERATOR <!> (
PROCEDURE = is_distinct_from(anyelement,anyelement),
LEFTARG = anyelement,
RIGHTARG = anyelement,
COMMUTATOR = <!>,
NEGATOR = =!=
);
我有一个允许两个NULL 值的表,我想防止重复记录,将NULL 视为一个值。
CREATE TABLE "Foo" (
"FooID" SERIAL PRIMARY KEY,
"Foo" TEXT NOT NULL,
"Bar" TIMESTAMPTZ
"Baz" TIMESTAMPTZ
EXCLUDE ("Foo" WITH =, "Bar" WITH =!=, "Baz" WITH =!=)
);
我收到以下错误:
错误:运算符 =!=(anyelement,anyelement) 不是 运算符族“datetime_ops”详细信息:排除运算符必须是 与约束的索引运算符类相关。
我已经查看了文档(here 和 here),但我很难理解这些材料。
另外,this question 可以被认为是这个的副本;但是,该问题中的问题在于与其他 RDBMS 的兼容性...此问题专门针对如何处理上述错误。
【问题讨论】:
-
FWIW,排除约束似乎没有必要;我认为像这样的约束应该(理论上)可以通过唯一索引和自定义 B 树操作类来实现。但是我tried it,它似乎不起作用。我怀疑空值的处理是硬连线到索引方法中的。不确定 GiST opclass 是否会有所不同。