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

Migration from Oracle to MariaDB - Trigger, Self-referencing table

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

本质上,如果不指定abelongs_to_id,它会认为它属于自己(并且与生成的ID相同ON INSERT);但是,如果指定了 belongs_to_id,那么它将使用它。

我这样做的原因是因为我有 post 和回复存储在同一个 table 中。如果 id = belongs_to_id 那么它是一个发起 post,而如果它不同,它是对另一个 post.

的回复

我考虑过让我的应用程序 (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;
/

这个should work in MariaDb as it closely conforms to 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;

也许只是

INSERTing时,设置belongs_to_id为NULL(无TRIGGER)。 当 SELECTing 时,执行 COALESCE(belongs_to_id, id).

与此同时,完全从 SEQUENCE 切换到 AUTO_INCREMENT(同样没有 TRIGGER)。