복붙노트

[SQL] MySQL은, 하나 개의 쿼리에 여러 테이블을 갱신

SQL

MySQL은, 하나 개의 쿼리에 여러 테이블을 갱신

나는 세 개의 테이블을 업데이트하는 기능을 가지고,하지만 난이 수행하는 세 개의 쿼리를 사용합니다. 나는 좋은 연습을위한 더 편리한 방법을 사용하고 싶습니다.

어떻게 하나의 쿼리를 MySQL의 여러 테이블을 갱신 할 수 있습니까?

해결법

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

    1.두 테이블, 도서 및 주문의 경우를보십시오. 경우에, 우리는 주문 표에 Order.ID = 1002 특정 순서로 책의 수를 증가 후, 우리는 또한 줄일 필요가있는 책 테이블에서 같은 번호로 우리의 재고 도서의 총 수.

    두 테이블, 도서 및 주문의 경우를보십시오. 경우에, 우리는 주문 표에 Order.ID = 1002 특정 순서로 책의 수를 증가 후, 우리는 또한 줄일 필요가있는 책 테이블에서 같은 번호로 우리의 재고 도서의 총 수.

    UPDATE Books, Orders
    SET Orders.Quantity = Orders.Quantity+2,
        Books.InStock = Books.InStock-2
    WHERE
        Books.BookID = Orders.BookID
        AND Orders.OrderID = 1002;
    
  2. ==============================

    2.

    UPDATE t1
    INNER JOIN t2 ON t2.t1_id = t1.id
    INNER JOIN t3 ON t2.t3_id = t3.id
    SET t1.a = 'something',
        t2.b = 42,
        t3.c = t2.c
    WHERE t1.a = 'blah';
    

    이 업데이트 가고, 당신은 예컨대 select 문,이 점을 변환 할 수 있는지 확인하려면 :

    SELECT t2.t1_id, t2.t3_id, t1.a, t2.b, t2.c AS t2_c, t3.c AS t3_c
    FROM t1
    INNER JOIN t2 ON t2.t1_id = t1.id
    INNER JOIN t3 ON t2.t3_id = t3.id
    WHERE t1.a = 'blah';
    

    다른 대답과 같은 테이블을 사용하는 예 :

    SELECT Books.BookID, Orders.OrderID,
        Orders.Quantity AS CurrentQuantity,
        Orders.Quantity + 2 AS NewQuantity,
        Books.InStock AS CurrentStock,
        Books.InStock - 2 AS NewStock
    FROM Books
    INNER JOIN Orders ON Books.BookID = Orders.BookID
    WHERE Orders.OrderID = 1002;
    
    UPDATE Books
    INNER JOIN Orders ON Books.BookID = Orders.BookID
    SET Orders.Quantity = Orders.Quantity + 2,
        Books.InStock = Books.InStock - 2
    WHERE Orders.OrderID = 1002;
    

    편집하다:

    그냥 재미를 위해,의 좀 더 흥미로운 무언가를 추가 할 수 있습니다.

    하자 당신이 책의 테이블과 저자의 테이블을 말한다. 당신의 책은 author_id 있습니다. 데이터베이스를 처음에 만들 때, 어떤 외부 키 제한 조건이 설정되지 않았다 나중에 프런트 엔드 코드에서 버그가 어떤 책이 잘못 author_ids에 추가 할 원인이되었다. DBA가로서 당신은 결정이 데이터를 포착하는 오른쪽 저자를 가리 키도록 책을 해결할 것을 만들어 있도록 author_id이 있어야 할 내용을 확인하기 위해이 책을 모두 통과해야하고 싶지 않아요. 그러나 각각의 통과와의 당신이 author_id를 가지고있는 사람이 실제 저자에 해당이 올바른지 것을 알고 가정 해 봅시다 너무 많은 책이있다. 그것은 무효 존재하지 않는 author_ids이 바로 그들이다. 사용자가 책의 정보를 업데이트하고 개발자가 바로이 문제에 대해 그것을 변경하지 않으위한 인터페이스가 이미 있습니다. 그러나 기존의 인터페이스는 무효 저자와 책을 모두 제외되도록 내부가, 저자 가입한다.

    당신이 할 수있는 것은 이것이다 : "알 수없는 작가"와 같은 가짜 저자 레코드를 삽입합니다. 그리고 알 수없는 저자를 차례로 모든 나쁜 기록의 author_id를 업데이트합니다. 그런 다음 데이터를 포착하는은, "알 수없는 작가"의 저자 설정된 모든 책을 검색 올바른 저자를 조회하고 수정할 수 있습니다.

    어떻게 나쁜 기록을 모두 알 수없는 작가를 가리 키도록 업데이트하려면 어떻게해야합니까? 이처럼 (알 수없는 저자의 author_id 가정은 99999입니다) :

    UPDATE books
    LEFT OUTER JOIN authors ON books.author_id = authors.id
    SET books.author_id = 99999
    WHERE authors.id IS NULL;
    

    위는 또한 알 수없는 저자에 NULL의 author_id이 책을 업데이트합니다. 당신이 원하지 않는 경우, 물론 당신이 추가 할 수의 books.author_id는 NULL을지지 않습니다.

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

    3.또한 하나 개의 쿼리가 너무 너무처럼 조인을 사용하여이 작업을 수행 할 수 있습니다 :

    또한 하나 개의 쿼리가 너무 너무처럼 조인을 사용하여이 작업을 수행 할 수 있습니다 :

    UPDATE table1,table2 SET table1.col=a,table2.col2=b
    WHERE items.id=month.id;
    

    그리고 단지 물론,이 정보를 제공해드립니다. 여기 조인에 대해 당신은 자세한 내용을보실 수 있습니다 : http://dev.mysql.com/doc/refman/5.0/en/join.html를. 이 주문에 대한 몇 가지 제한도의 여러 테이블에 제한하면 여기에 대해 읽을 수 있습니다 업데이트 : http://dev.mysql.com/doc/refman/5.0/en/update.html ( "가입"F 단지 CTRL +).

  4. ==============================

    4.당신이 말할 때 여러 쿼리는 당신이 여러 SQL 문을 의미합니까 :

    당신이 말할 때 여러 쿼리는 당신이 여러 SQL 문을 의미합니까 :

    UPDATE table1 SET a=b WHERE c;
    UPDATE table2 SET a=b WHERE d;
    UPDATE table3 SET a=b WHERE e;
    

    또는 여러 개의 쿼리 기능을 같이 호출

    mySqlQuery(UPDATE table1 SET a=b WHERE c;)
    mySqlQuery(UPDATE table2 SET a=b WHERE d;)
    mySqlQuery(UPDATE table3 SET a=b WHERE e;)
    

    전자 캔은 모든 것을 당신이 단순히 다음과 같은 방식으로는 mysql_query 함수를 호출 달성하기 위해 원한 경우 하나는 mysql_query 호출을 사용하여 수행 할 수 :

    mySqlQuery(UPDATE table1 SET a=b WHERE c; UPDATE table2 SET a=b WHERE d; UPDATE table3 SET a=b WHERE e;)
    

    이것은 하나의 mySqlQuery () 호출 세 쿼리를 실행합니다.

  5. ==============================

    5.시퀀스에서 여러 SQL 문을 구현하기 위해 : 그것은 무엇 저장 프로 시저가 있습니다 일반적입니다. 롤백을 사용하여 데이터의 일관성을 유지하기 위해, 그들은 즉, 하나 개의 작업 단위, 하나 그들은 모두 그들 중 누구도 없습니다 실행되거나으로 처리되도록 할 수 있습니다.

    시퀀스에서 여러 SQL 문을 구현하기 위해 : 그것은 무엇 저장 프로 시저가 있습니다 일반적입니다. 롤백을 사용하여 데이터의 일관성을 유지하기 위해, 그들은 즉, 하나 개의 작업 단위, 하나 그들은 모두 그들 중 누구도 없습니다 실행되거나으로 처리되도록 할 수 있습니다.

  6. from https://stackoverflow.com/questions/4361774/mysql-update-multiple-tables-with-one-query by cc-by-sa and MIT license