Cet article partage la méthode d'implémentation de la mise à jour des associations multi-tables dans MySQL et partage quelques exemples couramment utilisés de mise à jour multi-tables pour votre référence.
Cours recommandé : Tutoriel MySQL.
Créez le modèle simple suivant et construisez des données de test :
Dans un certain sous-système d'acceptation commerciale 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)
En raison de certains La raison est que les informations sur la ville où se trouve le client ne sont pas exactes, mais dans le sous-système CRM du service client, des informations précises telles que la ville où se trouvent 20 % de certains clients sont obtenues grâce à des services proactifs, vous extrayez donc cela une partie des informations dans un tableau temporaire :
create table tmp_cust_city ( customer_id number(8) not null, citye_name varchar2(10) not null, customer_type char(2) not null )
1) La forme la plus simple
--经确认customers表中所有customer_id小于1000均为'北京' --1000以内的均是公司走向全国之前的本城市的老客户:) update customers set city_name='北京' where customer_id<1000
2) Mise à jour liée à deux tables (plusieurs tables) -- uniquement la connexion dans le clause où
--这次提取的数据都是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) Mise à jour associée à deux tables (tables multiples) -- la valeur modifiée est calculée à partir d'une autre table
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 )
Notez que dans cette instruction,
(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 )
est deux sous-éléments indépendants Query, vérifiez le plan d'exécution et vous pouvez voir que 2 articles ont été analysés pour la table b/index
Si la condition Where est ignorée, la table A sera mise à jour par défaut
🎜>
pour l'ensemble du tableau, mais à cause de (select b. city_name from tmp_cust_city b Where Where b.customer_id=a.customer_id)Il est possible que "suffisamment" de valeurs ne puissent pas être fournies , car tmp_cust_city ne représente qu'une partie des informations du client, donc une erreur est signalée (si spécifié Column--city_name peut être NULL, ce qui est une autre affaire) : 01407, 00000, " impossible de mettre à jour (%s) vers NULL"// *Cause : // *Action :Méthode de remplacement :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),'未知') -- 当然这不符合业务逻辑了
(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 )
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!