source

UUID에 대한 트리거를 삽입하기 전에 MariaDB

factcode 2022. 9. 30. 11:01
반응형

UUID에 대한 트리거를 삽입하기 전에 MariaDB

Windows 64 플랫폼에서 MariaDB 5.5.29를 사용하고 있습니다.이 표를 작성했습니다.

CREATE TABLE DM_COUNTRIES
(
    COUNTRY_UUID BINARY(16) NOT NULL,
    C_NAME VARCHAR(255) NOT NULL UNIQUE,
    C_LOCALNAME VARCHAR(255) DEFAULT NULL,
    C_COUNTRYCODE VARCHAR(255) DEFAULT NULL,
    PRIMARY KEY (COUNTRY_UUID)
)
ENGINE=InnoDB;

여기서 UUID(프라이머리 키)가 지정되지 않은 경우 자동으로 삽입되는지 확인합니다.따라서 이 트리거를 만들었습니다.

DELIMITER |
CREATE TRIGGER TRIG_BI_DM_COUNTRIES
BEFORE INSERT ON DM_COUNTRIES
FOR EACH ROW
BEGIN
    IF NEW.COUNTRY_UUID IS NULL THEN
        SET NEW.COUNTRY_UUID = UUID();
    END IF;
END|
DELIMITER ;

스키마 변경이 필요하지 않은 경우에도 모든 것이 커밋되었는지 확인하려면:

COMMIT;

이것으로 새 행을 삽입하려고 하면 다음과 같이 됩니다.

INSERT INTO DM_COUNTRIES
    (C_NAME, C_LOCALNAME, C_COUNTRYCODE)
VALUES
    ('Großbritannien', 'Great Britain', 'UK');

트리거가 새로운 UUID를 배치하고 테이블에 성공적으로 삽입할 것으로 예상했습니다.하지만 이런 일이 벌어집니다.

에러 코드: 1364.필드 'COUNTRY_UUID'에 기본값이 없습니다.

UUID를 입력하지 않았기 때문에 이것은 확실히 정답입니다.방아쇠가 자동으로 채워지도록 되어 있었어요

생성된 값이 필드에 맞는지 확인하기 위해 unhex로 트리거를 공식화하려고 했습니다.

DELIMITER |
CREATE TRIGGER TRIG_BI_DM_COUNTRIES
BEFORE INSERT ON DM_COUNTRIES
FOR EACH ROW
BEGIN
    IF NEW.COUNTRY_UUID IS NULL THEN
        SET NEW.COUNTRY_UUID = UNHEX(REPLACE(UUID(), '-', ''));
    END IF;
END|
DELIMITER ;

결과는 여전히 똑같다.

문제는 다음과 같습니다.내가 뭘 잘못하고 있지?

않다는 이고, 이 기본값이되어 있지 않다는 입니다.또한 이 컬럼에는 디폴트값이 정의되어 있지 않습니다.DEFAULT NULL프라이머리 키이기 때문에

한 번 더 .DEFAULT 0다음과 같이 합니다.IF NEW.COUNTRY_UUID = 0 THEN:

DELIMITER |

CREATE TABLE DM_COUNTRIES
(
    COUNTRY_UUID BINARY(16) NOT NULL DEFAULT 0,         -- changed here
    C_NAME VARCHAR(255) NOT NULL UNIQUE,
    C_LOCALNAME VARCHAR(255) DEFAULT NULL,
    C_COUNTRYCODE VARCHAR(255) DEFAULT NULL,
    PRIMARY KEY (COUNTRY_UUID)
)
ENGINE=InnoDB |


CREATE TRIGGER TRIG_BI_DM_COUNTRIES
BEFORE INSERT ON DM_COUNTRIES
FOR EACH ROW
BEGIN
    IF NEW.COUNTRY_UUID = 0 THEN                        -- and here
        SET NEW.COUNTRY_UUID = UUID();
    END IF;
END |

INSERT INTO DM_COUNTRIES
    (C_NAME, C_LOCALNAME, C_COUNTRYCODE)
VALUES
    ('Großbritannien', 'Great Britain', 'UK') |

DELIMITER ;

SQL-Fiddle에서 테스트 완료(MySQL 5.5에서 사용 가능한 MariaDB 인스턴스 없음)

언급URL : https://stackoverflow.com/questions/15473654/mariadb-before-insert-trigger-for-uuid

반응형