我正在将Oracle数据库迁移到MariaDB,我不确定如何在其中一个表上创建自引用ID。
本质上,如果没有指定belongs_to_id
,它将假设它属于自己(并且与ID生成的ON INSERT
相同);但是,如果已经指定了belongs_to_id
,那么它将使用它。
我这样做的原因是我的帖子和回复存储在同一个表中。如果id
=belongs_to_id
,那么它是一个发起帖子,而如果它不同,那么它就是对另一个帖子的回复。
我曾想过让我的应用程序(NodeJS)使用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;
/
这应该在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;
也许只是
当为INSERTing
时,将belongs_to_id设置为NULL
(无TRIGGER
)。当SELECTing
时,执行COALESCE(belongs_to_id, id)
。
同时,完全从SEQUENCE
切换到AUTO_INCREMENT
(再次没有TRIGGER
)。