この記事では、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 サイトの他の関連記事を参照してください。