2013-03-18 130 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