Sql 无法在MariaDB中将UDF用作约束

Sql 无法在MariaDB中将UDF用作约束,sql,mariadb,Sql,Mariadb,我正在运行MariaDB 10.3.17,并试图向现有表添加约束。该约束使用UDF- 这是我的桌子和UDF 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 v

我正在运行MariaDB 10.3.17,并试图向现有表添加约束。该约束使用UDF-

这是我的桌子和UDF

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));

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;
然而,我得到下面的错误消息,我不知道为什么

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`

通常,您可以使用任何确定的用户定义函数UDF,但不能在诸如默认值、检查等约束中使用存储函数SF

UDF和SFs之间的一大区别是,UDF通常用C/C++编写,而SF则用SQL编写。这意味着不可能在同一连接内的UDF中执行SQL代码,这将导致重大问题,如SF所示:


根据存储引擎的不同,ALTER TABLE会锁定整个表、部分表或创建临时副本。我无法想象执行SQL语句SELECT*FROM real\u estate.sample\u two\u expected\u output t的方法,其中t.u\u id=u\u id。。当表被锁定或重新组织时,在SF中。看起来UDF和使用CREATE function的存储函数是两件完全不同的事情,这取决于它们的信息:用于创建存储函数而不是用户定义函数,请参阅创建函数。感谢Georg&Paul-我昨晚阅读了更多关于UDF的内容,并意识到我的错误是将UDF与存储函数混淆了。
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`