MariaDB在为UUID插入TRIGGER之前

时间:2013-03-18 09:43:06

标签: sql triggers 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放置到位,然后成功插入表中。但是会发生什么:

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 ;

结果仍然相同。

问题是:我做错了什么?

1 个答案:

答案 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实例)