2015-11-18 102 views
0

我正在將我的Oracle數據庫遷移到MariaDB,並且我不確定如何在其中一個表上創建自引用標識。基本上,如果沒有指定belongs_to_id,它將假定它屬於它自己(並且與生成的ID相同ON INSERT)。然而,如果指定belongs_to_id,那麼它將使用它。從Oracle遷移到MariaDB - 觸發器,自引用表

我這樣做的原因是因爲我有帖子和回覆存儲在同一張表中。如果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

這應該對MariaDb有效,你試過了嗎? – kevinsky

+0

不!我認爲它不會... Maria DB是否理解Oracle PL/SQL? – doublesidedstickytape

回答

1

should work在MariaDB的,因爲它非常符合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; 
+0

謝謝@kevinsky - 我已經將表格設置爲自動增量了 - 我可以在某個對象的某個對象中訪問「my_sequence」嗎? (原諒我的MariaDB無知) – doublesidedstickytape

+0

非常感謝你+1和接受 – doublesidedstickytape

+2

@doublesidedstickytape:當心可能發生的錯誤:'後續觸發器不允許更新NEW行。 – wchiquito

1

也許只是

INSERTing,設置belongs_to_id到NULL(無TRIGGER)。 當SELECTing,做COALESCE(belongs_to_id, id)

同時,完全從SEQUENCE切換到AUTO_INCREMENT(再次沒有TRIGGER)。