이 글에서는 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<10002) 테이블 2개(여러 개) 테이블) 관련 업데이트 - - where 절에서만 연결
--这次提取的数据都是VIP,且包括新增的,所以顺便更新客户类别 update customers a -- 使用别名 set customer_type='01' --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),'未知') -- 当然这不符合业务逻辑了
비교적 간단한 방법은 테이블 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!