programing

마리아에서 UDF를 제약 조건으로 사용할 수 없습니다.DB

golfzon 2023. 6. 23. 23:59
반응형

마리아에서 UDF를 제약 조건으로 사용할 수 없습니다.DB

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;

저는 이 함수를 테이블에 제약 조건으로 추가하려고 합니다.

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`

일반적으로 결정론적 사용자 정의 함수(UDF)는 사용할 수 있지만 저장된 함수(SF)는 사용할 수 없습니다.DEFAULT,CHECK,기타.

UDF와 SF의 큰 차이점은 UDF는 일반적으로 C/C++로 작성되고 SF는 SQL로 작성된다는 점입니다.즉, 동일한 연결 내에서 UDF에서 SQL 코드를 실행할 수 없으므로 SF에서 알 수 있듯이 심각한 문제가 발생할 수 있습니다.

스토리지 엔진에 따라 다름ALTER TABLE테이블 전체를 잠그거나 테이블의 일부를 잠그거나 임시 복사본을 만듭니다.SQL 문을 실행하는 방법을 상상할 수 없습니다.SELECT * FROM real_estate.sample_two_expected_output t WHERE t.u_id = u_id ..테이블이 잠겨 있거나 재구성되어 있는 동안 SF에 저장됩니다.

언급URL : https://stackoverflow.com/questions/65315443/cant-use-udf-as-constraint-in-mariadb

반응형