복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    4.당신은 다른 두 테이블에 삽입 할 샘플 테이블에 삽입 트리거 후를 만들 수 있습니다.

    당신은 다른 두 테이블에 삽입 할 샘플 테이블에 삽입 트리거 후를 만들 수 있습니다.

    내가이 일을 함께 볼 수있는 유일한 문제는 항상 비어 있거나이 경우 SS에있을 것입니다 adddetails을 삽입하는 방법이 실 거예요 있다는 것입니다. 당신이 innital 삽입과 함께 보내 질수 있도록 샘플 테이블에없는 actualy 샘플 그게 전부에 열을 삽입 할 수있는 방법은 없습니다.

    또 다른 옵션은 삽입을 실행하기 위해 저장 프로 시저를 작성하는 것입니다.

    당신은 태그 우리가 여기에 대해 데이터베이스를하고 이야기하는 PostgreSQL을 MySQL의 질문이 있습니까?

  5. from https://stackoverflow.com/questions/20561254/insert-data-in-3-tables-at-a-time-using-postgres by cc-by-sa and MIT license