从Oracle迁移到MariaDB - 触发器,自引用表

时间:2015-11-18 15:01:59

标签: oracle triggers mariadb self-referencing-table

我正在将我的Oracle数据库迁移到MariaDB,我不确定如何在我的一个表上创建自引用ID。

基本上,如果未指定belongs_to_id,则会假定它属于自身(并且与生成的ON INSERT}相同;但是,如果指定了belongs_to_id,那么它将使用它。

我这样做的原因是因为我在同一个表中存储了帖子和回复。如果id = belongs_to_id那么它就是一个发起帖子,而如果它不同,则是对另一个帖子的回复。

我已经考虑让我的应用程序(Node JS)使用last_insert_id快速UPDATE - 但它似乎相当混乱,如果可能的话我想避免这种情况。

这是我在Oracle中使用的内容 - 有人知道我如何在MariaDB中复制它吗?

CREATE OR REPLACE TRIGGER my_trigger
BEFORE INSERT ON my_table
FOR EACH ROW
BEGIN    
    :new.id := my_sequence.NEXTVAL;
    :new.belongs_to_id := NVL(:new.belongs_to_id,:new.id);
END;
/

2 个答案:

答案 0 :(得分:1)

MariaDb中的此should work因为它与SQL-99 syntax非常吻合。

CREATE OR REPLACE TRIGGER my_trigger
BEFORE INSERT ON my_table
FOR EACH ROW
BEGIN    
    :new.id := my_sequence.NEXTVAL;
    :new.belongs_to_id := NVL(:new.belongs_to_id,:new.id);
END;

如果将新ID设置为自动增量,则只能使用后插入触发器。像

这样的东西
CREATE OR REPLACE TRIGGER my_trigger
AFTER INSERT ON my_table
FOR EACH ROW
v_id NUMBER:
BEGIN    
    v_id := LAST_INSERT_ID();
    :old.belongs_to_id := NVL(:old.belongs_to_id,v_id);
END;

答案 1 :(得分:1)

也许只是

INSERTing时,将belongs_to_id设置为NULL(否TRIGGER)。 在SELECTing时,请执行COALESCE(belongs_to_id, id)

同时,完全从SEQUENCE切换到AUTO_INCREMENT(再次没有TRIGGER)。