複数テーブルへのupdate+insert

複数テーブルへのupdate+insert

【やりたい事】

複数テーブルにまたがって外部キー制約されているカラムに、upsert処理をしたい。

 

カラムにデータがあれば、update

データがなければinsert

をしていきたい。

 

■結論

①joinをする

②外部キー+CASCADE制約+replace

 

【考察】

joinして書いた方が、レベルが上がりそう!

②はすでにやって、かなりカンタンだったが、複合主キーなどに、少し難がある

 

1.【考察】まずは整理

2.【結合】JOINを利用

3.【制約】ON UPDATE CASCADE

4.【連結】JOINしてUPDATEしてみよう

5.【join】2つのテーブルをjoin

6.【複数】3つのテーブルをjoin

 

 

1.リレーションシップ関係にあるデータの更新

■やりたい事

・複数テーブルにまたがってUPDATEを行う

 

■検索キーワード

・mysql 複数テーブル 更新

 

■手法は2つ

①外部キーで関連付けられた別のテーブルのデータを更新

②MySQL 複数テーブルを JOIN してデータを更新 (UPDATE)>>

 

※JOINの注意点

複数テーブル更新クエリでは、条件を満たす各レコードが更新されます。

基準が複数回一致した場合でも、行は 1 回だけ更新されます。複数のテーブルを更新する構文は、ORDER BY および LIMIT キーワードでは使用できません。

 

Q,2つの方法があるけれど、どうしたらいいのか??

JOINとcascade+replaceのどちらを利用するのか??

 

 

 

2. JOINを利用

  1. JOINを使用する方法

この方法では、外部キーで結合されたテーブルのデータをJOINし、更新するデータを含む新しい値を設定し、UPDATEクエリを実行します。

 

CREATE TABLE orders (
id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
total_price DECIMAL(10, 2)
);

 

CREATE TABLE customers (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(50)
);

 

ALTER TABLE orders ADD CONSTRAINT fk_orders_customers
FOREIGN KEY (customer_id)
REFERENCES customers(id)
ON DELETE CASCADE;

 

ここで、ordersテーブルのcustomer_id列がcustomersテーブルのid列と外部キーで結合されています。

ordersテーブルのある行のcustomer_idを更新するには、以下のようなSQLクエリを実行します。

 

UPDATE orders
JOIN customers ON orders.customer_id = customers.id
SET orders.customer_id = 2, customers.email = 'new_email@example.com'
WHERE orders.id = 1;

 

この例では、ordersテーブルのcustomer_idが2に変更され、customersテーブルの対応する行の「email」が更新されます。

 

 

3. ON UPDATE CASCADE

  1. 外部キー制約のON UPDATE CASCADEを使用する方法

外部キー制約を設定して、ON UPDATE CASCADEオプションを使用することで、関連するテーブルのすべての行が自動的に更新されます。

例えば、以下のようなordersテーブルがあるとします。

 

CREATE TABLE orders (
id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
total_price DECIMAL(10, 2),
CONSTRAINT fk_orders_customers
FOREIGN KEY (customer_id)
REFERENCES customers(id)
ON UPDATE CASCADE
ON DELETE CASCADE
);

 

ここで、customer_id列に外部キー制約が設定され、ON UPDATE CASCADEオプションが使用されています。

これにより、customersテーブルのid列が更新されると、ordersテーブルのcustomer_id列も自動的に更新されます。

ordersテーブルのある行のcustomer_idを更新するには、以下のようなSQLクエリを実行します。

 

 

UPDATE customers SET id = 2 WHERE id = 1;

 

この例では、customersテーブルのidが1の行がidが2に更新され、ordersテーブルのすべての行のcustomer_idが自動的に更新されます。

 

4.joinをやってみよう

1.SELECE文を書く

2.UPDATE文を書く

 

1.SELECE文を書く

SELECT * FROM exam_results AS er

INNER JOIN exams AS e ON er.exam_id = e.exam_id

INNER JOIN students AS s ON er.student_id = s.student_id

WHERE e.exam_name_jp = '数学1'

AND s.gender = 'M';

 

join文の参照>>

 

ASってここで使うのか。短く書く事ができるようだけど、なんだか逆に一見性がないような気がする^^;

自分しか分からないようなASは書かない方が無難かも。

 

2.UPDATE文を書く

UPDATE exam_results AS er

INNER JOIN exams AS e ON er.exam_id = e.exam_id

INNER JOIN students AS s ON er.student_id = s.student_id

SET er.score = er.score + 1

WHERE e.exam_name_jp = '数学1'

AND s.gender = 'M';

 

SET部分が増えている。insertなんで、何を入れるのか?を指定したわけです。

 

これで文章が完成。

 

5.2つのテーブルをjoin

 

■JOINの文章について

SELECT * FROM monthly_sales

JOIN employee_name_entry_year

ON monthly_sales.id = employee_name_entry_year.id;

 

monthly_salesテーブルを基準にして結合をしていきます。

 

 

■説明

SELECT テーブル1から抽出するカラム FROM 基準にしたいテーブル1の名前

JOIN 結合させたいテーブル2の名前

ON テーブル1の名前.基準にするカラム名 = テーブル2の名前.基準にするカラム名;

 

 

 

■ASをつける

SELECT * FROM monthly_sales AS x

JOIN employee_name_entry_year AS y

ON x.id = y.id;

 

ON以下を書くのがすごい楽になる。

 

 

■USINGを使う

SELECT * FROM monthly_sales

JOIN employee_name_entry_year

USING(id);

 

ON部分をさらにすっきり掛けます。

 

※ONにはカラム名が異なっても中身が同じであれば問題ない、という仕様があります

 

■構文

SELECT x.id, x.sales AS 売上, y.name AS 名前, y.entry_year AS 入社年, z.prefecture AS 出身県 FROM monthly_sales AS x

JOIN employee_name_entry_year AS y

USING(id)

JOIN employee_address AS z

USING(id);

 

 

 

こんな感じになるらしいです。

 

【参照】

参照はこちらです>>

 

 

6.3つのテーブルをjoin

 

SELECT * FROM テーブル1

JOIN テーブル2 ON テーブル1.user_id = テーブル2.user_id

JOIN テーブル3 ON テーブル1.user_id = テーブル3.user_id

WHERE テーブル1.user_id = 値

 

// 結果 user_id,氏名,性別,年齢,生年月日

 

JOINでは2つ以上のテーブルを扱う都合上

カラム名がどのテーブル由来のものかを明示するために「テーブル名.カラム名」という指定の仕方をします。

 

SELECT *

FROM テーブル1.*,テーブル2.* ,テーブル3.年齢

JOIN テーブル2 ON テーブル1.user_id = テーブル2.id

JOIN テーブル3 ON テーブル1.user_id = テーブル3.id

WHERE テーブル1.user_id = 値

 

// 結果 user_id,氏名,性別,年齢

 

参照はこちら>>

 

 

$query = $this->db->query("SELECT * FROM company_t
JOIN company_name_t ON company_t.company_id=company_name_t.company_id
JOIN school_t ON company_t.company_id=school_t.company_id
WHERE company_t.company_id='$post_data_company'");

 

 

 

まとめ

 

 

無理せず、楽しく、生産的に働きましょう!ご相談は下記まで

 

 

 

この記事を読んだ人は、こんな記事も読んでいます

■ 設計について■

エンティティの抽出

UMLとは何か?

ER図を覚えよう

アンチパターンとは?

GitHubとは

 

■アンチパターン

論理削除

ジェイウォーク(交差テーブルを作らない)

1文字エイリアス

全部小文字

複数列属性(マルチカラムアトリビュート)

パスワード

フラグの闇

 

■アップロード

サーバーにアップロード

 

 

SEO対策の基本 外部要因とは?

SEO対策の基本的である、外部要因とは何か?

SEO対策をするなら絶対に知っておきたい、基本知識です。

 

売れるサイトを作るのに知って起きたい知識

サーチエンジンマーケティングという言葉をご存知でしょうか?

ホームページで商品やサービスを売る時に知っておきたいマーケティング

についてご紹介いたします。

seo対策をするメリットとは

SEO対策をする5つのメリットとは?

なぜ上位表示させることが大事なのか?なぜSEO対策をする必要があるのか

についてご紹介させていただきます。

 

内部要因とは

SEO対策の内部要因とは?

上位表示させるためには、内部要因について知っておくことも大事です。

キーワードを上位表示させるために必要なのは、ソースコードを最適化することです

内部要因の対策について知りたい方はこちらへ

 

キーワード対策をするまえに

キーワード対策をする前に

そのキーワード対策。ちょっと待ってください。

そのまま対策をすると、必ずお金を損してしまいます。個人事業主や中小企業は

そんな大きなキーワードで対策をしてはいけません。

広告費用が高くなる理由とは

広告費用が高くなる本当の理由とは?

売れないサイトに集めていませんか?広告費用がかかるわりには

お問い合わせが少ない・・・と感じる方は多いはずです。

購入率の悪いサイトに集客をしている可能性があります。

 

 

 

 

【SEO対策・web広告・webコンサルティングのプラスワーク対応エリアについて】

プラスワークでは、東京、神奈川、千葉、埼玉を中心に全国でwebコンサルティング、SEO対策、ホームページの更新、ホームページのリニューアル運営代行をしております。売上アップをお考えならお気軽にご相談ください。

 

【SEO対策・web広告・webコンサルティングのプラスワーク 対応地域】

北海道 [ 北海道 ]

東北  [ 青森 | 岩手 | 山形 | 福島 | 秋田 | 宮城 ]

関東  [ 東京 | 埼玉 | 千葉 | 茨城 | 栃木 | 群馬 | 神奈川 ]

甲信越 [ 山梨 | 長野 | 新潟 ]

北陸  [ 石川 | 福井 | 富山 ]

東海  [ 愛知 | 静岡 | 岐阜 | 三重 ]

近畿  [ 大阪 | 兵庫 | 京都 | 滋賀 | 奈良 | 和歌山 ]

中国  [ 島根 | 山口 |鳥取 | 広島 | 岡山 ]

四国  [ 徳島 | 香川 | 愛媛 | 高知 ]

九州  [ 福岡 | 佐賀 | 長崎 | 熊本 | 大分 | 宮崎 | 鹿児島 ]

プラスワークでは全国でSEO対策、ホームページ更新、制作をしております。中小企業専門SEO対策・ホームページ更新制作会社、ダイレクト レスポンス マーケティング、ウェブ マーケティング、マーケティング 分析、口コミのよいSEO対策会社をお探しならプラスワークにお任せくださいませ。

 

 

【コンテンツ】

トップへ

更新レスキュー

料金について

制作実績

お客様の声

よくある質問

会社概要

お問い合わせ

【更新レスキュー】

ライトコース

ゴールドコース

プラチナコース

 

【その他】

ニュース

メルマガ登録

特別資料プレゼント

相互リンク募集中

【課題から探す】

ホームページの課題

SEO対策とは

SEO対策がダメな理由

上位表示されない理由

相互リンクとは

順位が落ちてしまう原因

 

 

フェイスブック  ツイッター