복붙노트

[SQL] 외래 키에 의해 링크 된 데이터 삽입 속으로 테이블

SQL

외래 키에 의해 링크 된 데이터 삽입 속으로 테이블

나는 PostgreSQL을 사용하고 있습니다.

Customer
==================
Customer_ID | Name

Order
==============================
Order_ID | Customer_ID | Price

주문을 삽입하려면, 여기, 내가 일반적으로해야 할 일이다

예를 들어, "존"장소 "1.34"가격 순서.

(1) Get Customer_ID from Customer table, where name is "John"
(2) If there are no Customer_ID returned (There is no John), insert "John"
(3) Get Customer_ID from Customer table, where name is "John"
(4) Insert "Customer_ID" and "1.34" into Order table.

이 간단한 작업에 참여 데이터베이스 4 SQL 통신이 있습니다!

1 SQL 문을 사용하여 달성 할 수있는 더 좋은 방법이 있나요?

해결법

  1. ==============================

    1.당신은 기존 고객, 새로운 3 문에 대한 하나의 SQL 문에 그것을 할 수 있습니다. 당신이 할 일은 고객이 이미 존재하는 것처럼 낙관적 행동이 될 것입니다 :

    당신은 기존 고객, 새로운 3 문에 대한 하나의 SQL 문에 그것을 할 수 있습니다. 당신이 할 일은 고객이 이미 존재하는 것처럼 낙관적 행동이 될 것입니다 :

    insert into "order" (customer_id, price) values \
    ((select customer_id from customer where name = 'John'), 12.34);
    

    고객이 존재하지 않는 경우, 당신은 텍스트가 같을 것이다 SQL 예외를 얻을 것이다 :

    null value in column "customer_id" violates not-null constraint
    

    (당신이 한 내가 확신하는, 당신이 null이 허용되지 않는 CUSTOMER_ID 만들어 제공). 그 예외가 발생하면 고객 테이블에 고객을 삽입하고 주문 테이블에 삽입을 다시 실행 :

    insert into customer(name) values ('John');
    insert into "order" (customer_id, price) values \
    ((select customer_id from customer where name = 'John'), 12.34);
    

    당신의 사업이 만들 것입니다 속도로 성장하지 않는 유일한 진짜 문제 "여기서 모든 돈을 넣어", 당신의 삽입의 대부분은 기존 고객에 대한 것입니다. 그래서, 대부분의 시간은 예외가 발생하지 않습니다 그리고 당신은 하나 개의 문장으로 수행 할 수 있습니다.

  2. ==============================

    2.아니 일반 문, 아니.

    아니 일반 문, 아니.

    당신이 할 수있는 것은 PL / pgSQL의 함수의 기능을 래핑 (또는 다른 언어를하지만, PL / pgSQL의이 가장 적합한 것 같다), 그리고 단지 그 함수를 호출합니다. 즉, 여전히 응용 프로그램을 단일 명령문 수 있습니다 의미합니다.

  3. ==============================

    3.저장 프로 시저를 사용합니다.

    저장 프로 시저를 사용합니다.

    그리고 심지어는 저장 프로 시저를 사용하지 않는 싶은 가정 - 대부분의 3 개 명령을 실행하기에 당신이 '재 INSERT INTO를 ... "할 수있는 한,하지 4. 두 번째지고 ID가, 쓸모가있다.

  4. from https://stackoverflow.com/questions/1997998/insert-data-into-tables-linked-by-foreign-key by cc-by-sa and MIT license