我在 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
This is definetly the correct answer as I did not provided an UUID. The trigger was supposed to fill it automatically.
I tried to formulate the trigger with unhex, just to make sure the generated value fits in the field:
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 实例)
关于sql - MariaDB 在为 UUID 插入触发器之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15473654/