2013-03-18 132 views
1

我在Windows 64平台上使用MariaDB 5.5.29。我创造了这个表:MariaDB之前为UUID插入触发器

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 ; 

,结果还是一样。

问题是:我做错了什么?

回答

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

+1

谢谢你@ypercube - 为你的anwer确定无误。测试成功了。 Partely。我发现,使用UNHEX的想法对于获得完整的UUID到字段是必要的:'SET NEW.COUNTRY_UUID = UNHEX(REPLACE(UUID(),' - ',''));'这是完整的解决方案。非常感谢你! – zero0 2013-03-18 11:30:51