【发布时间】:2020-09-13 22:42:36
【问题描述】:
我一直在尝试将触发器从 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:“更新类..”代码是我从 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 - “字段列表”中的未知列“正在插入”
如果有人可以帮助我,将不胜感激。提前谢谢你:)
【问题讨论】:
-
我确定你很接近。出于好奇,请ORACLE mode。
LAST_INSERT_ID看起来不对,它来自上一个插入。OLD.pk IS NULL可能是确定inserting的方法。 -
mariadb-10.3 也有sequence objects
-
不能在 NOT NULL 上插入 NULL。
标签: mysql oracle mariadb sql-insert database-trigger