sql - MariaDB 在为 UUID 插入触发器之前

标签 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

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/

相关文章:

SQL:DB2 iSeries 的窗口聚合函数

javascript - Google 表格中的 Google Apps 脚本是否有类似悬停的触发器?

sql - HANA:SQL 触发器设置行的最后修改日期?

erlang - 您使用什么模块或库在 Erlang 中生成通用唯一标识符 (UUID)?

mysql - UUID 作为主键不工作 Laravel

sql - 返回 View 中两列之一 - 以不为空的一列为准

mysql - 使用 MySQL 将单元格值转换为列

mysql - 如何连接具有多个主键的三个表

java - 如何处理同一个 quartz 调度程序的两个触发器

java - 如何在 Java 中获取 32 位唯一编号?