postgresql插入递归数据

时间:2015-04-18 02:41:48

标签: database postgresql recursion tree common-table-expression

我想插入一批递归数据,每行在同一个表中对其父行的id有parent_id个引用。插入所有行的快捷方式是什么?

CREATE TABLE subjects (
  id      SERIAL PRIMARY KEY,
  name    CHARACTER VARYING(128)      NOT NULL
);

CREATE TABLE items (
  id       SERIAL PRIMARY KEY,
  subject_id INTEGER                  NOT NULL REFERENCES subjects (id),
  content TEXT,
  parent_id INTEGER REFERENCES items (id)
);

我可以等待每个返回的id,然后将其设置为parant_id,但这会导致每个insert等待其父项完成。 以下插入内容似乎仅适用于1个父级和1个小孩,如果我还要插入主题有item 2item 2child 2,该怎么办?我不必使用此查询,我只是想知道更好的方法来执行此操作。

WITH s AS
  ( INSERT INTO subjects (NAME)
   VALUES ('some subject') RETURNING *),
     i AS
  ( INSERT INTO items (subject_id, content)
   VALUES (
             (SELECT id
              FROM s), 'item parent 1') RETURNING *)
INSERT INTO items (subject_id, content, parent_id)
VALUES (
          (SELECT id
           FROM s), 'item parent 1 child 1',
          (SELECT id
           FROM i))

sqlfiddle

0 个答案:

没有答案