0

これが私のテーブルの最小バージョンです:

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親を持たないため null になりますが、 はroot_idそれ自体を参照する必要があります。idに同じ値を挿入する方法はありroot_idますか? 挿入、新しい ID の取得、および 2 番目のクエリでのルート ID の変更を避けたいのですが、おそらくそれが唯一の方法です。

前もって感謝します。

4

3 に答える 3

1

あなたができる

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

フィドルを参照してください。

于 2013-03-31T13:47:07.747 に答える
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 ;
于 2013-03-31T13:47:25.937 に答える
0

きちんとしたものを考えてテストしました。動作しているように見えますが、特定の条件下ではうまくいかない可能性がありますか?

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

これに何か問題やデメリットはありますか?

于 2013-03-31T13:53:39.033 に答える