MySQL триггер для вставки без первичного ключа - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь создать триггер, который создает первичный ключ, если это поле не указано в операторе вставки.EG:

insert into mydb.mytable (nonprimarykeyfield) values ('test');

Триггер

CREATE DEFINER=`root`@`%` TRIGGER `mydb`.`mytable_BEFORE_INSERT` 
BEFORE INSERT ON `mytable` 
FOR EACH ROW
    BEGIN
        if NEW.pk is null then 
            SET NEW.pk = UUID();
        end if;
        set new.created_at=now();
    END

Вставка завершается неудачно с

Error Code: 1062. Duplicate entry '' for key 'PRIMARY'

, но нет строки с нулем в качестве первичного ключа.

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Очевидно, NEW.pk не равно нулю, следовательно, он не получает результат UUID. Если вы запускаете insert, как вы описали, без указания значения pk, то у него есть default, что вызывает проблемы с дублированием. Run

show create table mytable;

для получения дополнительной информации.

EDIT:

Кроме того, вместо триггеров вы можете просто использовать auto_increment.

0 голосов
/ 26 июня 2019

Я понял, что поскольку первичным ключом является varchar, он, очевидно, не может иметь значение null (хотя MySQL Workbench позволяет сбить его с толку в «alter table», которая немедленно возвращается к «». Это и стало причиной проблемы. Поэтому проверка должна выполняться для блока '' в блоке 'if'. Я изменил триггер, как показано ниже, и вставка работает, как ожидалось

CREATE DEFINER=`root`@`%` TRIGGER `mydb`.`mytable_BEFORE_INSERT` BEFORE INSERT ON `mytable` FOR EACH ROW
BEGIN
    if NEW.pk ='' then 
        SET NEW.pk = UUID();
    end if;
    set new.created_at=now();
END

ДОПОЛНИТЕЛЬНЫЙ КОММЕНТАРИЙ: В качестве темы для обсуждения следует прочитать приведенные выше комментарии Раймонда Нейланда в отношении производительности и дизайна базы данных. Хорошие вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...