我可以从列 CHECK 约束调用用户定义的函数吗?

Bre*_*ter 4 sql sqlanywhere

我有一个返回 1 或 0 的用户定义的 SQL 函数,我想从列 CHECK 约束中调用它。

Bre*_*ter 5

是的。SQL Anywhere 没有布尔数据类型,因此您必须编写一个生成 TRUE、FALSE 或 UNKNOWN 的谓词。换句话说,如果函数返回 1 或 0 表示通过或失败,则必须将约束编码为 CHECK ( f() = 1 )。

请注意,TRUE 和 UNKNOWN 都会导致“通过”;只有 FALSE 结果才会导致检查失败。

以下示例演示如何更改已包含数据的表,以添加具有此类 CHECK 约束的列。

布雷克

CREATE TABLE t (
   pkey INTEGER NOT NULL PRIMARY KEY );

INSERT t VALUES ( 1 );
COMMIT;

CREATE FUNCTION is_filled_in ( 
   IN @value VARCHAR ( 100 ) )
RETURNS TINYINT
BEGIN
   IF COALESCE ( @value, '' ) <> '' THEN
      RETURN 1;
   ELSE 
      RETURN 0;
   END IF;
END;

ALTER TABLE t ADD c VARCHAR ( 3 ) DEFAULT 'xxx'
   CHECK ( is_filled_in ( c ) = 1 );

-- Works ok...
INSERT t VALUES ( 2, 'yyy' );
COMMIT;

-- Throws SQLCODE -209 Invalid value for column 'c' in table 't'...
INSERT t VALUES ( 3, '' );
COMMIT;

SELECT * FROM t;
Run Code Online (Sandbox Code Playgroud)

  • @Stefan:我已经准备好了答案,所以“1分钟”实际上反映了我有多慢,而不是快。AFAIK 可以发布带有答案的问题,至少根据常见问题解答是这样。 (3认同)