Merge: Databases for Developers #17

때로는 데이터베이스에 새 행을 추가하려는 경우가 있습니다 그곳에

하지만 이미 새로운 값으로 덮어 쓰고 싶다면 당신이 제공했습니다 예를 들어 나는 카드 게임을 좋아합니다 하지만 카드에는 습관이 있습니다 시간이 없어 그러니 이제는 카드를 몇 장 더 추가해야합니다

갑판 그러나 새로운 것들은 조금만 나오는 경향이 있습니다 허풍을 부리는 교활한! 그래서 내가해야 할 일은 기존의 모든 카드를 동일하게 업데이트하는 것입니다 스타일 그래서 일부 카드를 업데이트하고 다른 카드를 삽입하고 싶습니다 upsert를위한 시간이다! 두 가지 방법 중 하나를 사용하여 업서 트에 접근 할 수 있습니다 먼저 삽입하고 행이 이미 존재하면 갱신하십시오

또는 다른 방법 업데이트 후 if 행이 없습니다 낭비되는 노력을 줄이려면 이러한 작업 중 하나만 수행하면됩니다 그러나 당신은 종종 당신이해야 할 일을 미리 알지 못합니다 네가 그렇게했다면 필요에 따라 삽입 또는 업데이트를 작성할 수 있습니다

그래서 이것은 당신을 까다롭게 만듭니다 결정 : 당신은 먼저 시도합니까? 삽입 또는 업데이트 하시겠습니까? 가장 많이 넣고 싶다 가능성이 가장 높은 행동을 먼저 그러나 이것은 귀하의 데이터에 달려 있습니다 예를 들어 카드가없는 경우 갑판을 구입하면 모든 것은 삽입물입니다 그래서 할 말이 있습니다

이 첫번째 하지만 몇 달 뒤 갑판에 보충해야 할 때 삽입 할 카드가 두 장 뿐이고 다른 모든 것은 업데이트입니다 그래서 먼저 업데이 트를 할 감각 그리고 이것은 지금부터있을 것입니다 그렇지 않으면 누군가가 내 모든 데크를 훔치고, 우리는 다시 인서트가되는 모든것으로 돌아 간다! 따라서 가장 위험한 작업은 경고없이 시간이 지남에 따라 변경 될 수 있습니다

과 당신이 먼저하고 싶은 것은 거의 드물지 않습니다 너는 많은 돈을 쓸 수있다 먼저 삽입하거나 업데이트하는 것이 더 나은지 여부를 결정하려는 노력; 만 데이터 변경으로 이러한 노력을 취소 할 수 있습니다 다행히도이 혼란에서 탈출구가 있습니다 병합해라! 이것은 하나의 진술이다

행을 하나의 테이블에서 가져 와서 다른 테이블에 삽입하거나 업데이트합니다 참여 기준 조인이 일치하는 행을 찾으면이를 갱신합니다 그렇지 않다면 인서트 따라서 더 이상 먼저 할 일을 결정할 필요가 없습니다

병합에서 조인해야합니다 소스의 각 행을 최대 하나의 행에 링크하십시오 그래서 너는 ~해야 해 고유 한 속성 집합에 조인 할 수 있습니다 가치와 정장 인 카드 놀이

일치가있는 경우 우리는 when matched 절에 쓸 내용을 정의합니다 그리고 만약 일치하지 않는 절에 새 행을 추가하지 않습니다 이 절은 모두 선택 사항입니다 따라서 삽입 만하거나 병합 만 수행 할 수 있습니다 업데이트

어느 쪽이 평범한 오래된 삽입물이나 업데이트, 그렇지? 나는 개인적으로 삽입물 병합의 이점을 볼 수 없다는 것을 의미합니다 결국 선택 결과를 삽입 할 수 있습니다 그러나 일부 경우에만 병합 업데이트가 유용 할 수 있습니다 한 테이블에서 행을 업데이트하려면 다른 사용자의 값을 자주 사용하여 상관 업데이트를 실행해야합니다 이것들은 목표 테이블의 각 행에 대해 다시 실행해야하기 때문에 실행 속도가 매우 느립니다

소스에 대한 서브 쿼리 그러나 병합을 사용하면 데이터베이스가 각 테이블을 쿼리하면됩니다 일단 이렇게하면 시간을 크게 절약 할 수 있으므로 병합 업데이트 만 여전히 유용 할 수 있습니다 병합의 힘이 거기에서 멈추지 않습니다

where 절을 다음에 추가 할 수도 있습니다 삽입과 갱신이 모두 일어나서 모든 행을 변경하지 마십시오 에 대한 예 :이 갑판에있는 농담하는 사람의 디자인이 정말 마음에 듭니다 그래서 나는 그들을 지키고 싶다 따라서 카드를 덮어 쓰지 않으려면 카드가 조커가 아닌지 확인하십시오

아니면 거의 사용되지 않기 때문에 그냥 제거하고 싶을 수도 있습니다 이것을하기 위해 when matches 절에 delete 문을 추가하십시오 그러나 이것이 안에 있기 때문에 업데이트 섹션에서는 대상에 이미 존재하는 행만 변경할 수 있습니다 테이블 및이 소스에서 일치하는 행이 있습니다 예를 들어, 새 데크에 jokers가있는 경우 업데이트 된 병합은 기존의 jokers를 만지지 않습니다

현재 갑판 그래서 그들은 삭제되지 않았습니다 이 문제를 해결할 수는 있지만 필요합니다 일부 복잡한 SQL이 그렇게합니다 원하는 경우 설명의 링크를 확인하십시오

이것에 대해 더 많이 알기 그래서 병합의 간단한 개요였습니다 할 수있는 편리한 방법이었습니다 upserts 이것은 삽입보다 빨리 실행될 수 있으며 삽입되지 않은 경우도 있습니다

업데이트 또는 그 반대 그러나 당신이 항상 그렇게 할 것이라는 확신이 99 % 이상이라면 삽입 또는 항상 업데이트를 수행하면 별도의 명령문을 작성하는 것이 더 빠를 수 있습니다 하지만 언제나처럼 데이터를 테스트하고 확인하십시오! 보고 주셔서 감사합니다! 비디오를 만들려는 SQL 주제가 있습니까? 의견을 통해 알려 주시고 향후 업데이트에 가입하십시오