как преобразовать триггер "при вставке" из oracle в mysql - PullRequest
1 голос
/ 27 мая 2020

Я пытался преобразовать триггер из oracle в MySQL / MariaDB. Я все еще новичок в MySQL, поэтому я все еще думаю.

Это структура таблицы из таблицы, которую я использую триггером:

CREATE TABLE `attendance` (
  `attendanceid` varchar(10) NOT NULL,
  `studentname` varchar(50) DEFAULT NULL,
  `classname` varchar(20) DEFAULT NULL,
  `status` varchar(20) DEFAULT NULL,
  `atdate` varchar(20) DEFAULT NULL,
  `classid` varchar(20) DEFAULT NULL
)

Я уже создал таблицу последовательности для триггера, как показано ниже:

CREATE TABLE `att_seq` (
  `id` int(11) NOT NULL
)

Это код из oracle:

CREATE OR REPLACE TRIGGER "STUDENT"."CLASSID" 
BEFORE INSERT ON attendance
FOR EACH ROW
declare
BEGIN
 if :new.attendanceid is null then
                  select 'ATT' || attandance_seq.nextval into :new.attendanceid from dual;

    if inserting then
            if(:new.classname = '4A') then
            :new.classid := 'CLASS401';
            end if;
            if(:new.classname = '4B') then
            :new.classid := 'CLASS402';
            end if;
             if(:new.classname = '4C') then
            :new.classid := 'CLASS403';
            end if;
    end if;
  end if;
END;
/

, и это, безусловно, то, как я его преобразовал (p / s: код 'update class ..' - это новый код, который я добавил из oracle):

DELIMITER $$
CREATE TRIGGER att_auto_id
BEFORE INSERT ON attendance
FOR EACH ROW
BEGIN
  INSERT INTO att_seq VALUES (NULL);
  SET NEW.attendanceid = CONCAT('ATT', LPAD(LAST_INSERT_ID(), 3, '00'));
  
  IF inserting THEN
    IF new.classname = `4A` THEN
        SET new.classid = `CLASS401`;
        UPDATE class 
        SET classid = new.classid;
    END IF;
    IF new.classname = `4B` THEN
        SET new.classid = `CLASS402`;
        UPDATE class 
        SET classid = new.classid;
    END IF;
    IF new.classname = `4C` THEN
        SET new.classid = `CLASS403`;
        UPDATE class 
        SET classid = new.classid;
    END IF;
  END IF;
END $$ 

когда я запускаю его, я получаю эту ошибку:

1054 - Неизвестный столбец «вставка» в «список полей»

Было бы очень признательно, если бы кто-нибудь мог мне помочь. Спасибо заранее :)

1 Ответ

1 голос
/ 27 мая 2020

Ключевое слово inserting в триггерах Oracle помогает определить, был ли триггер вызван операцией вставки, потому что в Oracle вы можете определить триггер, который будет вызываться несколькими событиями (например, перед вставкой или обновлением) .

Однако в mysql триггер может быть вызван только одним событием, поэтому нет необходимости в этом ключевом слове в mysql. Просто не используйте условие if inserting then в вашем коде.

Кроме того, форматирование значения последовательности в таблице неверно - либо форматируйте значение, когда вы отображаете его в своем приложении, либо используйте zerofill свойство при объявлении столбца. Таким образом, вы можете использовать столбец auto_increment непосредственно в таблице.

В объявлении таблицы последовательности отсутствует свойство auto_increment. Поле также объявлено как not null, поэтому вы не можете использовать null для создания нового значения auto_increment. Используйте либо поле, допускающее значение NULL, либо предложение с пустыми значениями.

Кроме того, я думаю, вам также следует удалить все операторы update class. Эти операторы безоговорочно обновят поле classid всех записей в таблице классов для всех записей.

...