Maison  >  Article  >  base de données  >  mise à jour de l'association multi-tables mysql

mise à jour de l'association multi-tables mysql

(*-*)浩
(*-*)浩original
2019-05-09 14:44:007124parcourir

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.

mise à jour de l'association multi-tables 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=&#39;01&#39; --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),&#39;未知&#39;)
-- 当然这不符合业务逻辑了

Une méthode plus simple consiste à remplacer la table A dans l'expression de valeur et à utiliser les clauses group by et have pour afficher les enregistrements en double. <🎜>
(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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn