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 に答える