You need to enable JavaScript to run this app. MariaDB 10.3.17中使用UDF创建CHECK约束报错问题
优惠活动
大模型
产品
解决方案
定价
更多

MariaDB 10.3.17中使用UDF创建CHECK约束报错问题

MariaDB 10.3.17 环境下UDF实现CHECK约束报错问题

基本背景

当前运行的数据库版本为MariaDB 10.3.17,计划为已存在的表添加使用用户定义函数(UDF)实现逻辑的约束。参考官方约束相关说明,该用法本应被允许。
预期实现效果:插入、更新表数据时,自动校验同一u_id下的日期区间不存在重叠。

已定义的表结构

CREATE OR REPLACE TABLE real_estate.sample_two_expected_output (
u_id int (9) NOT NULL,
first_date date NOT NULL,
last_date date NOT NULL,
days int AS (DATEDIFF(last_date,first_date)+1),
address varchar(50),
price varchar(50),
--Constraints
CONSTRAINT dates CHECK (last_date >= first_date),
PRIMARY KEY (u_id,first_date));

自定义UDF代码

DELIMITER //
USE real_estate;
CREATE OR REPLACE FUNCTION overlap(
    u_id INT,
    first_date DATE,
    last_date DATE
) RETURNS INT DETERMINISTIC
BEGIN
    DECLARE valid INT;
    SET valid = 1; 
    IF EXISTS(SELECT * FROM real_estate.sample_two_expected_output t WHERE t.u_id = u_id AND first_date <= t.last_date AND t.first_date <= last_date) THEN SET valid = 0; 
    ELSE SET valid = 1; 
    END IF; 
    RETURN valid;
END; \\
DELIMITER;

执行的约束添加语句

尝试通过ALTER TABLE语句将上述UDF逻辑作为约束添加到表中,执行语句为:

ALTER TABLE real_estate.sample_two_expected_output ADD CONSTRAINT overlap CHECK(overlap(u_id,first_date,last_date)=1);

报错信息

执行后返回如下错误,暂不清楚报错原因:

EXECUTE FAIL:
  ALTER TABLE real_estate.sample_two_expected_output ADD CONSTRAINT overlap CHECK(overlap(u_id,first_date,last_date)=1);
Message :
  Function or expression '`overlap`()' cannot be used in the CHECK clause of `overlap`

内容的提问来源于stack exchange,提问作者Wilze

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.13 11:15:08