MariaDB的BEFORE INSERT触发器用于UUID

3

我正在使用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 ;

结果仍然是一样的。 问题是:我做错了什么?
1个回答

5
我认为问题在于该列没有定义默认值,而我们无法将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实例可用)


1
谢谢@ypercube - 您的答案肯定是正确的。 测试很成功。部分地。 我发现,使用UNHEX的想法对于将完整的UUID放入字段是必要的:SET NEW.COUNTRY_UUID = UNHEX(REPLACE(UUID(),'-','')); 这是完整的解决方案。 非常感谢你! - zero0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接