0

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

本质上,如果 abelongs_to_id没有指定,它将假定它属于自己(并且与生成的 ID 相同ON INSERT);但是,如果belongs_to_id已指定 a,那么它将使用它来代替。

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

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

这是我在 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;
/
4

2 回答 2

1

也许只是

当 时INSERTing,将belongs_to_id 设置为NULL(否TRIGGER)。什么时候SELECTing,做COALESCE(belongs_to_id, id)

同时,完全从SEQUENCEto切换AUTO_INCREMENT(再次 no TRIGGER)。

于 2015-12-01T19:12:42.650 回答
1

应该在 MariaDb 中工作,因为它非常符合SQL-99 语法

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;
于 2015-11-18T15:41:50.780 回答