[SQL] 포스트 그레스를 사용하여 한 번에 3 개 테이블의 데이터 삽입
SQL포스트 그레스를 사용하여 한 번에 3 개 테이블의 데이터 삽입
나는 하나의 쿼리로 3 개 테이블에 데이터를 삽입 할. 아래처럼 내 표는 외모 :
CREATE TABLE sample (
id bigserial PRIMARY KEY,
lastname varchar(20),
firstname varchar(20)
);
CREATE TABLE sample1(
user_id bigserial PRIMARY KEY,
sample_id bigint REFERENCES sample,
adddetails varchar(20)
);
CREATE TABLE sample2(
id bigserial PRIMARY KEY,
user_id bigint REFERENCES sample1,
value varchar(10)
);
나는 모든 삽입에 대한 보답의 핵심을 얻을 것이다 나는 다음 표에서 해당 키를 삽입해야합니다. 내 질문은 :
insert into sample(firstname,lastname) values('fai55','shaggk') RETURNING id;
insert into sample1(sample_id, adddetails) values($id,'ss') RETURNING user_id;
insert into sample2(user_id, value) values($id,'ss') RETURNING id;
나는 하나의 쿼리를 실행하지만 그들은 단지 나에게 값을 반환하고 나는 즉시 다음 쿼리를 다시 사용할 수 없습니다.
어떻게 이것을 달성하기 위해?
해결법
-
==============================
1.사용 열팽창 계수를 데이터 - 수정 :
사용 열팽창 계수를 데이터 - 수정 :
WITH ins1 AS ( INSERT INTO sample(firstname, lastname) VALUES ('fai55', 'shaggk') -- ON CONFLICT DO NOTHING -- optional addition in Postgres 9.5+ RETURNING id AS user_id ) , ins2 AS ( INSERT INTO sample1 (user_id, adddetails) SELECT user_id, 'ss' FROM ins1 -- RETURNING user_id -- only if used in turn ) INSERT INTO sample2 (user_id, value) -- same here SELECT user_id, 'ss' FROM ins1;
각 INSERT는 전에 하나에 따라 달라집니다. 대신 값 SELECT는 더 행은 이전 INSERT에서 반환되지 않는 경우 확인 아무것도 자회사 테이블에 삽입되지 수 있습니다. (관련 : 포스트 그레스의 ON 충돌 절 9.5+) 또한 약간 짧고 빠르게이 방법입니다.
일반적으로, 그것은 한 곳에서 완전한 데이터 행을 제공하는 것이 더 편리합니다 :
WITH data(firstname, lastname, adddetails, value) AS ( VALUES -- provide data here (text 'fai55', text 'shaggk', text 'ss', text 'ss2') -- see below -- more? -- works for multiple input rows ) , ins1 AS ( INSERT INTO sample (firstname, lastname) SELECT firstname, lastname FROM data -- DISTINCT? see below ON CONFLICT DO NOTHING -- requires UNIQUE constraint RETURNING firstname, lastname, id AS sample_id ) , ins2 AS ( INSERT INTO sample1 (sample_id, adddetails) SELECT sample_id, adddetails FROM data JOIN ins1 USING (firstname, lastname) RETURNING sample_id, user_id ) INSERT INTO sample2 (user_id, value) SELECT user_id, value FROM data JOIN ins1 USING (firstname, lastname) JOIN ins2 USING (sample_id);
독립 실행 형 VALUES 식의 명시 적 타입 캐스트를해야 할 수도 있습니다. 데이터 유형은 목표 테이블로부터 유도된다는 INSERT에 부착 VALUES 식 반대로.
여러 행이 동일 (이름, 성)와 함께 할 수있는 경우, 첫 번째 INSERT에 대한 중복을 접을 필요가 있습니다 :
... INSERT INTO sample (firstname, lastname) SELECT DISTINCT firstname, lastname FROM data ...
당신은 데이터 소스 대신 CTE 데이터로 (임시) 테이블을 사용할 수 있습니다.
자세한 내용과 함께, 관련 :
-
==============================
2.이 같은
이 같은
with first_insert as ( insert into sample(firstname,lastname) values('fai55','shaggk') RETURNING id ), second_insert as ( insert into sample1( id ,adddetails) values ( (select id from first_insert), 'ss') RETURNING user_id ) insert into sample2 ( id ,adddetails) values ( (select user_id from first_insert), 'ss');
sample2를에 삽입에서 생성 된 ID가 필요하지 않습니다, 나는 마지막으로 삽입에서 돌아 절을 제거했습니다.
-
==============================
3.일반적으로 복잡한 쿼리를 작성 피하기 위해 트랜잭션을 사용하십시오.
일반적으로 복잡한 쿼리를 작성 피하기 위해 트랜잭션을 사용하십시오.
http://www.postgresql.org/docs/current/static/sql-begin.html
http://dev.mysql.com/doc/refman/5.7/en/commit.html
당신은 또한 당신의 포스트 그레스 태그를 가정하는 것은 올바른하는 CTE를 사용할 수 있습니다. 예를 들어 :
with sample_ids as ( insert into sample(firstname, lastname) values('fai55','shaggk') RETURNING id ), sample1_ids as ( insert into sample1(id, adddetails) select id,'ss' from sample_ids RETURNING id, user_id ) insert into sample2(id, user_id, value) select id, user_id, 'val' from sample1_ids RETURNING id, user_id;
-
==============================
4.당신은 다른 두 테이블에 삽입 할 샘플 테이블에 삽입 트리거 후를 만들 수 있습니다.
당신은 다른 두 테이블에 삽입 할 샘플 테이블에 삽입 트리거 후를 만들 수 있습니다.
내가이 일을 함께 볼 수있는 유일한 문제는 항상 비어 있거나이 경우 SS에있을 것입니다 adddetails을 삽입하는 방법이 실 거예요 있다는 것입니다. 당신이 innital 삽입과 함께 보내 질수 있도록 샘플 테이블에없는 actualy 샘플 그게 전부에 열을 삽입 할 수있는 방법은 없습니다.
또 다른 옵션은 삽입을 실행하기 위해 저장 프로 시저를 작성하는 것입니다.
당신은 태그 우리가 여기에 대해 데이터베이스를하고 이야기하는 PostgreSQL을 MySQL의 질문이 있습니까?
from https://stackoverflow.com/questions/20561254/insert-data-in-3-tables-at-a-time-using-postgres by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 두 번 같은 테이블에 가입하는 가장 좋은 방법은 무엇입니까? (0) | 2020.04.03 |
---|---|
[SQL] 어떻게 SQLite 데이터베이스에 날짜 값을 삽입합니까? (0) | 2020.04.03 |
[SQL] 조건으로 하위 쿼리에서 삭제 MYSQL (0) | 2020.04.03 |
[SQL] 어떻게 SQL에서 복합 기본 키를 정의 할 수 있습니다? (0) | 2020.04.03 |
[SQL] 합니까 외래 키 쿼리 성능을 향상? (0) | 2020.04.03 |