반응형
마리아에서 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
반응형
'programing' 카테고리의 다른 글
| 스프링 부트 테스트에서 와이어모크 랜덤 포트로 속성 설정 (0) | 2023.06.23 |
|---|---|
| ASP.NET 사용자 지정 Validator 클라이언트 측 및 서버 측 유효성 검사가 시작되지 않음 (0) | 2023.06.23 |
| 조건부 연산자 권리가 연관성이 있는 이유는 무엇입니까? (0) | 2023.06.23 |
| 활동에서 원래 추가된 창이 누출되었습니다. (0) | 2023.06.23 |
| MongoDB 노드 드라이버가 인스턴스 풀을 생성하는 동안 오류가 발생하는 이유는 무엇입니까? (0) | 2023.06.03 |