我在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 ;
结果还是一样。
问题是:我做错了什么?