Я хочу создать скрипт вставки для таблицы sd_roles. Некоторые строки должны иметь значения идентификатора другой строки.

Таблица sd_roles создается с помощью этого скрипта:

-- Table: sd_roles

-- DROP TABLE sd_roles;

CREATE TABLE sd_roles
(
  id integer NOT NULL DEFAULT nextval('roles_serials'::regclass),
  masterid integer,
  rname character varying(150) NOT NULL,
  CONSTRAINT sd_roles_pkey PRIMARY KEY (id),
  CONSTRAINT rname_unique UNIQUE (rname)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE sd_roles
  OWNER TO postgres;
GRANT ALL ON TABLE sd_roles TO postgres;
GRANT ALL ON TABLE sd_roles TO eomeroff;

-- Trigger: lowecase_roles_on_insert_trigger on sd_roles

-- DROP TRIGGER lowecase_roles_on_insert_trigger ON sd_roles;

CREATE TRIGGER lowecase_roles_on_insert_trigger
  BEFORE INSERT OR UPDATE
  ON sd_roles
  FOR EACH ROW
  EXECUTE PROCEDURE lowecase_roles_on_insert();

У меня есть такой код:

    DELETE FROM sd_roles;


    WITH appconfiguration AS (
        INSERT INTO sd_roles
            (masterid, rname)
        VALUES
            (null, 'Appconfiguration')
        RETURNING id
    )
    INSERT INTO sd_roles (masterid, rname)
    VALUES ((SELECT id FROM appconfiguration), 'GroupsandRolesConfig');

Теперь мне нужно добавить код для вставки другой строки, в которой будет поле masterid, равное идентификатору строки, значение rname которой равно GroupandRolesConfig. Точно так же, как строка, где поле «rname» равнозначно «GroupsandRolesConfig», имеет значение «masterid», которое является идентификатором строки, поле «rname» которой эквивалентно «Appconfiguration».

Моя проблема в том, что предложение вставки, которое следует за cluase, не может запомнить идентификатор вставленного значения, поэтому я мог бы его повторно использовать.

Как это сделать?

0
eomeroff 24 Июн 2014 в 16:53
Использовать другой CTE? Я думаю, что вопрос нуждается в небольшом уточнении.
 – 
Jakub Kania
24 Июн 2014 в 17:22
 – 
a_horse_with_no_name
24 Июн 2014 в 17:28
Я задал еще один вопрос, потому что первый, может быть, плохо сформулирован, все же не хотел его стирать, потому что, возможно, он кому-то пригодится. Любая помощь для меня по любому из вопросов?
 – 
eomeroff
24 Июн 2014 в 18:16
Пожалуйста, проверьте, стало ли это яснее
 – 
eomeroff
24 Июн 2014 в 18:27
Спасибо, чувак, ты действительно подтолкнул меня к анализу этого, в то время как я хотел улучшить вопрос, я получил ответ.
 – 
eomeroff
24 Июн 2014 в 18:46

2 ответа

Лучший ответ

У вас может быть более одного CTE, вы можете связать их столько, сколько вам нужно.

     WITH appconfiguration AS (
        INSERT INTO sd_roles
            (masterid, rname)
        VALUES
            (null, 'Appconfiguration')
        RETURNING id
    ), groups AS (
      INSERT INTO sd_roles (masterid, rname)
        VALUES ((SELECT id FROM appconfiguration), 'GroupsandRolesConfig')
      RETURNING id
    )
    INSERT INTO sd_roles (masterid, rname)
        VALUES ((SELECT id FROM groups), 'foobar');

http://sqlfiddle.com/#!15/3cebb/3

1
Jakub Kania 24 Июн 2014 в 19:20

Этот код работает:

DELETE FROM sd_roles;

    INSERT INTO sd_roles (masterid, rname)
    VALUES (null, 'Superadmin');

    WITH appconfiguration AS (
        INSERT INTO sd_roles
            (masterid, rname)
        VALUES
            (null, 'Appconfiguration')
        RETURNING id
    )
    INSERT INTO sd_roles (masterid, rname)
    VALUES ((SELECT id FROM appconfiguration), 'Database'),
            ((SELECT id FROM appconfiguration), 'GroupsandRolesConfig');

    WITH groupsandRolesConfig AS (
         SELECT * FROM sd_roles where rname = LOWER('GroupsandRolesConfig')
    )
    INSERT INTO sd_roles (masterid, rname)
    VALUES ((SELECT id FROM groupsandRolesConfig), 'AddDeleteGroups'),
            ((SELECT id FROM groupsandRolesConfig), 'AssignRolesToGroups');
0
eomeroff 24 Июн 2014 в 18:45