PostgreSQL 自引用表 - 如何在脚本中存储父 ID?

Opa*_*pal 4 postgresql parent-child self-reference sql-returning

我有下表:

DROP SEQUENCE IF EXISTS CATEGORY_SEQ CASCADE;
CREATE SEQUENCE CATEGORY_SEQ START 1;

DROP TABLE IF EXISTS CATEGORY CASCADE;

CREATE TABLE CATEGORY (
  ID        BIGINT                 NOT NULL DEFAULT nextval('CATEGORY_SEQ'),
  NAME      CHARACTER VARYING(255) NOT NULL,
  PARENT_ID BIGINT
);

ALTER TABLE CATEGORY
  ADD CONSTRAINT CATEGORY_PK PRIMARY KEY (ID);
ALTER TABLE CATEGORY
  ADD CONSTRAINT CATEGORY_SELF_FK FOREIGN KEY (PARENT_ID) REFERENCES CATEGORY (ID);
Run Code Online (Sandbox Code Playgroud)

现在我需要插入数据。所以我从父母开始:

INSERT INTO CATEGORY (NAME) VALUES ('PARENT_1');
Run Code Online (Sandbox Code Playgroud)

现在我需要刚刚插入的父级的 ID 来向其中添加子级:

INSERT INTO CATEGORY (NAME, PARENT_ID) VALUES ('CHILDREN_1_1', <what_goes_here>);
INSERT INTO CATEGORY (NAME, PARENT_ID) VALUES ('CHILDREN_1_2', <what_goes_here>);
Run Code Online (Sandbox Code Playgroud)

如何获取并存储父级的 ID,以便稍后在后续插入中使用它?

小智 5

您可以将数据修改 CTE 与以下returning子句一起使用:

with parent_cat (parent_id) as (
   INSERT INTO CATEGORY (NAME) VALUES ('PARENT_1')
   returning id
)
INSERT INTO CATEGORY (NAME, PARENT_ID) 
VALUES 
  ('CHILDREN_1_1', (select parent_id from parent_cat) ), 
  ('CHILDREN_1_2', (select parent_id from parent_cat) );
Run Code Online (Sandbox Code Playgroud)