我正在将我的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;
/
答案 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
)。