ホームページ  >  記事  >  データベース  >  mysqlマルチテーブル関連付けの更新

mysqlマルチテーブル関連付けの更新

(*-*)浩
(*-*)浩オリジナル
2019-05-09 14:44:007146ブラウズ

この記事では、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='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
)
## であることに注意してください。 # は 2 つの独立したサブクエリです。実行プランを確認すると、テーブル b/index に対して 2 つの記事がスキャンされていることがわかります。

where 条件が破棄されると、テーブル A がテーブル全体で更新されます。デフォルトでは

ですが、(select b. city_name from tmp_cust_city b where b.customer_id=a.customer_id)

のため、「十分な」値を提供できない可能性があります。 tmp_cust_city は顧客情報の一部にすぎないため、

したがって、エラーが報告されます (列 --city_name が指定されている場合は NULL にすることもできますが、これは別の問題です):

01407, 00000, "cannot update (%s) to NULL"

// *原因:

// *アクション:

置換メソッド:

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 と Hasting Word を使用して重複レコードを表示することです。

rree

以上がmysqlマルチテーブル関連付けの更新の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。