2013-03-31 52 views
0

這裏是我的表中的最低版本:插入一行包含行的ID另一列,除了id列

CREATE TABLE posts (
    id int unsigned PRIMARY KEY auto_increment, 
    root_id int unsigned, 
    parent_id int unsigned 
); 

的數據是一個樹狀結構,所以parent_id字段包含明顯, root_id字段包含根帖子的ID,即樹中最頂端的帖子,樹中最早的祖先。

現在,當我插入一個本身是新樹根的新帖子時,parent_id將爲空,因爲它沒有父項,但root_id應該引用自身。有沒有辦法做一個插入,將相同的值idroot_id?我想避免插入,獲得新的ID,並改變第二個查詢的根id,但也許這是唯一的方法。

在此先感謝。

+0

您可以使root_id和parent_id具有相同的值以指示最上面的項目。查找觸發器。 – Tim

+0

確實如此,但這會讓我的應用程序邏輯複雜化,我必須根據是否存在根標識符或者是否爲空來執行兩個ifs。 – Sophivorus

+0

我不同意。您將不允許使用空值,使parent_id成爲必填字段。 – Tim

回答

1

你可以做

INSERT INTO 
    posts 
SET 
    root_id = (SELECT Auto_increment FROM information_schema.tables WHERE table_name = 'posts'); 

fiddle

1

您可以將insert

delimiter | 
CREATE TRIGGER update_root AFTER INSERT on posts 
FOR EACH ROW 
BEGIN 
    if NEW.parent_id IS NULL 
    then 
     SET NEW.root_id = NEW.id; 
    end if; 
END 
| 
delimiter ; 
0

我只是覺得一個整潔之一和測試之後立即使用觸發器來更新表。它似乎工作,但也許在某些情況下它可能會出錯?

INSERT INTO posts (root_id, parent_id) VALUES (LAST_INSERT_ID() + 1, NULL); 

這是否有任何問題或缺點?

+0

如果最後一個插入位於不同的表中,該怎麼辦? – MichaelRushton

+0

當然!謝謝... – Sophivorus

+0

不用擔心。看到我的答案,找到一個可行的解決方案。 – MichaelRushton