IT박스

INSERT… RETURNING의 반환 값을 다른 INSERT에서 사용할 수 있습니까?

itboxs 2020. 11. 17. 07:55
반응형

INSERT… RETURNING의 반환 값을 다른 INSERT에서 사용할 수 있습니까?


이와 같은 것이 가능합니까?

INSERT INTO Table2 (val)
VALUES ((INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id));

반환 값을 값으로 사용하여 첫 번째 테이블을 참조하여 두 번째 테이블에 행을 삽입하는 것과 같은가요?


Postgres 9.1부터 그렇게 할 수 있습니다.

with rows as (
INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id
)
INSERT INTO Table2 (val)
SELECT id
FROM rows

그 동안 id에만 관심이 있다면 트리거를 사용하여 그렇게 할 수 있습니다.

create function t1_ins_into_t2()
  returns trigger
as $$
begin
  insert into table2 (val) values (new.id);
  return new;
end;
$$ language plpgsql;

create trigger t1_ins_into_t2
  after insert on table1
for each row
execute procedure t1_ins_into_t2();

이 상황에 대한 모범 사례입니다. 사용 RETURNING … INTO.

INSERT INTO teams VALUES (...) RETURNING id INTO last_id;

Denis de Bernardy의 답변에 따라 ..

나중에 id를 반환하고 Table2에 더 많은 것을 삽입하려면 다음을 수행하십시오.

with rows as (
INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id
)
INSERT INTO Table2 (val, val2, val3)
SELECT id, 'val2value', 'val3value'
FROM rows
RETURNING val

다음 lastval()기능을 사용할 수 있습니다 .

nextval모든 시퀀스에 대해 가장 최근에 얻은 값을 반환합니다.

그래서 다음과 같이 :

INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val)  VALUES (lastval());

nextval()INSERT 사이의 다른 시퀀스 (현재 세션에서)를 호출 하는 사람이 없으면 제대로 작동합니다 .

데니스는 아래에 명시된 내가 사용에 대한 위의 경고 lastval()다른 시퀀스를 사용하여 액세스하는 경우 곤경에 당신을 얻을 수 nextval()귀하의 INSERT들 사이. 이는 시퀀스에서 Table1수동으로 호출 nextval()INSERT 트리거 SERIAL있거나 또는BIGSERIAL 기본 키가 있는 테이블에서 INSERT를 수행 한 경우 발생할 수 있습니다. 당신이 정말로 편집증이되고 싶다면 (좋은 점은, 결국 당신을 얻는다는 것입니다), 당신은 사용할 수 currval()있지만 관련 시퀀스의 이름을 알아야합니다 :

INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val)  VALUES (currval('Table1_id_seq'::regclass));

자동으로 생성 된 시퀀스는 일반적으로 테이블 이름과 열 이름이있는 t_c_seq곳에서 t이름 c이 지정되지만 항상 다음으로 이동하여 다음 psql과 같이 말 하여 확인할 수 있습니다 .

=> \d table_name;

and then looking at the default value for the column in question, for example:

id | integer | not null default nextval('people_id_seq'::regclass)

FYI: lastval() is, more or less, the PostgreSQL version of MySQL's LAST_INSERT_ID. I only mention this because a lot of people are more familiar with MySQL than PostgreSQL so linking lastval() to something familiar might clarify things.


DO $$
DECLARE tableId integer;
BEGIN
  INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id INTO tableId;
  INSERT INTO Table2 (val) VALUES (tableId);
END $$;

Tested with psql (10.3, server 9.6.8)


table_ex

id default nextval('table_id_seq'::regclass),

camp1 varchar

camp2 varchar

INSERT INTO table_ex(camp1,camp2) VALUES ('xxx','123') RETURNING id 

참고URL : https://stackoverflow.com/questions/6560447/can-i-use-return-value-of-insert-returning-in-another-insert

반응형