HSQLDB - 如何在检查约束中使用自定义函数
HSQLDB - How to use custom function in check constraint
首先我创建了一个简单的函数:
CREATE FUNCTION MY_FUNCTION(IN MY_ID BIGINT) RETURNS BOOLEAN
SPECIFIC MY_FUNCTION_WITH_BIGINT LANGUAGE SQL NOT DETERMINISTIC READS SQL DATA RETURNS NULL ON NULL INPUT
RETURN MY_ID IN (SELECT ID
FROM TABLE1
WHERE NAME IN ('name1', 'name2'));
然后我尝试在 CHECK
约束中使用它:
ALTER TABLE TABLE2 ADD CONSTRAINT CONSTRAINT1 CHECK (MY_FUNCTION(C1) = TRUE)
我明白了:
java.lang.RuntimeException: org.hsqldb.HsqlException: invalid expression in CHECK or GENERATED clause
不明白为什么,有什么办法可以达到预期的效果吗?
默认情况下,HSQLDB 只允许 SQL 标准允许的表达式类型。这些表达式非常具体,无论您何时检查约束,都保证 return 相同的结果。这不包括用户定义的函数和许多内置函数。
您可以添加具有所需检查的 TRIGGER。 TRIGGER是在INSERT或者UPDATE的时候执行的,所以不保证以后的有效性。
首先我创建了一个简单的函数:
CREATE FUNCTION MY_FUNCTION(IN MY_ID BIGINT) RETURNS BOOLEAN
SPECIFIC MY_FUNCTION_WITH_BIGINT LANGUAGE SQL NOT DETERMINISTIC READS SQL DATA RETURNS NULL ON NULL INPUT
RETURN MY_ID IN (SELECT ID
FROM TABLE1
WHERE NAME IN ('name1', 'name2'));
然后我尝试在 CHECK
约束中使用它:
ALTER TABLE TABLE2 ADD CONSTRAINT CONSTRAINT1 CHECK (MY_FUNCTION(C1) = TRUE)
我明白了:
java.lang.RuntimeException: org.hsqldb.HsqlException: invalid expression in CHECK or GENERATED clause
不明白为什么,有什么办法可以达到预期的效果吗?
默认情况下,HSQLDB 只允许 SQL 标准允许的表达式类型。这些表达式非常具体,无论您何时检查约束,都保证 return 相同的结果。这不包括用户定义的函数和许多内置函数。
您可以添加具有所需检查的 TRIGGER。 TRIGGER是在INSERT或者UPDATE的时候执行的,所以不保证以后的有效性。