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
'IT박스' 카테고리의 다른 글
CouchDB 복제 프로토콜은 무엇입니까? (0) | 2020.11.17 |
---|---|
HTML 일반 제어 div에 CSS 클래스를 추가하는 방법은 무엇입니까? (0) | 2020.11.17 |
Windows Batch Command를 사용하여 Jenkins에서 환경 변수를 어떻게 사용합니까? (0) | 2020.11.17 |
Moment.js는 날짜에서 요일 이름을 얻습니다. (0) | 2020.11.17 |
존재하지 않는 경우 디렉토리를 생성 한 다음 해당 디렉토리에 파일도 생성합니다. (0) | 2020.11.17 |