>  기사  >  데이터 베이스  >  mysql 다중 테이블 연결 업데이트

mysql 다중 테이블 연결 업데이트

(*-*)浩
(*-*)浩원래의
2019-05-09 14:44:007141검색

이 글에서는 mysql에서 다중 테이블 연관 업데이트를 구현하는 방법을 공유하고, 참고할 수 있도록 일반적으로 사용되는 다중 테이블 업데이트의 몇 가지 예를 공유합니다.

추천 강좌: MySQL 튜토리얼.

mysql 다중 테이블 연결 업데이트

다음과 같은 간단한 모델을 만들고 일부 테스트 데이터를 구성합니다.
특정 비즈니스 승인 하위 시스템 BSS에서

--客户资料表
create table customers
(
customer_id number(8) not null, -- 客户标示
city_name varchar2(10) not null, -- 所在城市
customer_type char(2) not null, -- 客户类型
...
)
create unique index PK_customers on customers (customer_id)
#🎜 🎜#어떤 이유로 고객이 위치한 도시에 대한 정보가 정확하지 않습니다. 그러나 고객 서비스 부서의 CRM 하위 시스템에서는 사전 조치를 통해 일부 고객의 20%가 위치한 도시에 대한 정확한 정보를 얻습니다. 정보의 이 부분은 임시 테이블로 추출됩니다:


create table tmp_cust_city
(
customer_id number(8) not null,
citye_name varchar2(10) not null,
customer_type char(2) not null
)
1) 가장 간단한 형식

--经确认customers表中所有customer_id小于1000均为'北京'
--1000以内的均是公司走向全国之前的本城市的老客户:)
update customers
set city_name='北京'
where customer_id<1000

2) 테이블 2개(여러 개) 테이블) 관련 업데이트 - - where 절에서만 연결

--这次提取的数据都是VIP,且包括新增的,所以顺便更新客户类别
update customers a -- 使用别名
set customer_type=&#39;01&#39; --01 为vip,00为普通
where exists (select 1
from tmp_cust_city b
where b.customer_id=a.customer_id
)

3) 2테이블(다중 테이블) 연관 업데이트 - 수정된 값이 다른 테이블에서 계산됨

update customers a -- 使用别名
set city_name=(select b.city_name from tmp_cust_city b where b.customer_id=a.customer_id)
where exists (select 1
from tmp_cust_city b
where b.customer_id=a.customer_id
)
-- update 超过2个值
update customers a -- 使用别名
set (city_name,customer_type)=(select b.city_name,b.customer_type
from tmp_cust_city b
where b.customer_id=a.customer_id)
where exists (select 1
from tmp_cust_city b
where b.customer_id=a.customer_id
)
#🎜🎜 #이 명령문에서

(select b.city_name,b.customer_type
from tmp_cust_city b
where b.customer_id=a.customer_id
)
与
(select 1
from tmp_cust_city b
where b.customer_id=a.customer_id
)

는 두 개의 독립적인 하위 쿼리입니다. 실행 계획을 보면 테이블 b/index에 대해 2개의 기사가 스캔되었음을 알 수 있습니다. where 조건이 삭제되면 기본적으로 테이블 A는

전체가 업데이트되지만 (tmp_cust_city b에서 b.city_name 선택 where b.customer_id=a.customer_id)#🎜로 인해 🎜#

tmp_cust_city는 고객 정보의 일부일 뿐이므로 "충분한" 값이 제공되지 않을 수 있습니다.

따라서 오류가 보고됩니다(지정된 열--city_name이 NULL일 수 있는 경우). , 다른 문제입니다):

01407, 00000, "(%s)를 NULL로 업데이트할 수 없습니다."

// *원인:

#🎜🎜 #// *Action:

교체 방법:

update customers a -- 使用别名
set city_name=nvl((select b.city_name from tmp_cust_city b where b.customer_id=a.customer_id),a.city_name)
或者
set city_name=nvl((select b.city_name from tmp_cust_city b where b.customer_id=a.customer_id),&#39;未知&#39;)
-- 当然这不符合业务逻辑了

비교적 간단한 방법은 테이블 A를 값 표현식으로 대체하고 group by 및 has 절을 사용하여 중복 항목을 보는 것입니다. 기록.

(select b.customer_id,b.city_name,count(*)
 from tmp_cust_city b,customers a 
 where b.customer_id=a.customer_id
 group by b.customer_id,b.city_name
 having count(*)>=2
)

위 내용은 mysql 다중 테이블 연결 업데이트의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.