Search code examples
postgresqlparent-childself-referencesql-returning

PostgreSQL self referential table - how to store parent ID in script?


I've the following table:

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);

Now I need to insert the data. So I start with parent:

INSERT INTO CATEGORY (NAME) VALUES ('PARENT_1');

And now I need the ID of the just inserted parent to add children to it:

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>);

How can I get and store the ID of the parent to later use it in the subsequent inserts?


Solution

  • The answer is to use RETURNING along with WITH

    WITH inserted AS (
      INSERT INTO CATEGORY (NAME) VALUES ('PARENT_1')
      RETURNING id
    ) INSERT INTO CATEGORY (NAME, PARENT_ID) VALUES
      ('CHILD_1_1', (SELECT inserted.id FROM inserted)),
      ('CHILD_2_1', (SELECT inserted.id FROM inserted));