我在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放置到位,然后成功插入表中。但是会发生什么:
Error Code: 1364. Field 'COUNTRY_UUID' doesn't have a default value
这绝对是正确的答案,因为我没有提供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 ;
结果仍然相同。
问题是:我做错了什么?
答案 0 :(得分:4)
我认为问题是该列没有定义默认值 - 我们不能将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实例)