programing

두 개의 외부 키가 동시에 NULL이 되지 않도록 합니다.

goodjava 2022. 11. 2. 00:29

두 개의 외부 키가 동시에 NULL이 되지 않도록 합니다.

MySQL/MariaDB에서 두 개의 외부 키가 암호화되지 않도록 하려면 어떻게 해야 합니까?NULL동시에?이건 처음에 꽤 간단한 것 같은데, 나는 그것을 사용했어.CREATE다음과 같은 문 제약 조건:

CREATE TABLE `Table` (
    `foo_id` INT UNSIGNED UNIQUE DEFAULT NULL,
    `bar_id` INT UNSIGNED UNIQUE DEFAULT NULL,
    CONSTRAINT `CHECK_keys_present` CHECK (
        ((`foo_id` IS NOT NULL) OR (`bar_id` IS NOT NULL)) != FALSE
    ),
    FOREIGN KEY (`foo_id`) REFERENCES `Foo` (`foo_id`) ON UPDATE CASCADE ON DELETE SET NULL,
    FOREIGN KEY (`bar_id`) REFERENCES `Bar` (`bar_id`) ON UPDATE CASCADE ON DELETE SET NULL
);

이 솔루션은 열의 값을 수동으로 업데이트하면 작동합니다.foo_id그리고.bar_id이 경우 컬럼은 다음 값이 되지 않습니다.NULL동시에.그러나 테이블에서 행을 삭제할 때Foo또는Bar(다음으로 외부 키의 값을NULL이 때문에ON UPDATE(조항) 제약사항CHECK_keys_present트리거되지 않습니다.

또, 이 기능을 사용해 본 적이 있습니다.BEFORE UPDATE방아쇠를 당겼지만 이것들도 효과가 없는 것 같습니다.

MariaDB 버전 10.4.8을 사용하고 있습니다.

그리고 이상한 것도 써봤는데((`foo_id` IS NOT NULL) OR (`bar_id` IS NOT NULL)) != FALSE구성, 왜냐하면(`foo_id` IS NOT NULL) OR (`bar_id` IS NOT NULL)동작하지 않았다.

이것은 완전한 답은 아닙니다.왜냐하면 저는 특정 레퍼런스를 찾지 못했기 때문입니다.check제약., MariaDB는 외부캐스케이드에 트리거강제하지 않습니다.

트리거에는 다음과 같은 제한이 적용됩니다.

. . . - 트리거는 외부 키 액션에 의해 활성화되지 않습니다.

라고 추측할 수 있다check제약조건은 동일한 범주에 속합니다.

이는 캐스케이드된 외부 키 제약으로는 원하는 작업을 수행할 수 없음을 의미합니다.

FOREIGN KEYs,TRIGGERs,CHECK기본적인 기능밖에 없습니다.애플리케이션 코드 또는 스토어드 프로시저에서 보다 복잡한 작업을 수행해야 합니다.

언급URL : https://stackoverflow.com/questions/58719070/preventing-two-foreign-keys-to-be-null-at-the-same-time