2

我在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 ;

结果还是一样。

问题是:我做错了什么?

4

1 回答 1

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

于 2013-03-18T10:45:19.870 回答