複数テーブルへのupdate+insert
複数テーブルへのupdate+insert
【やりたい事】
複数テーブルにまたがって外部キー制約されているカラムに、upsert処理をしたい。
カラムにデータがあれば、update
データがなければinsert
をしていきたい。
■結論
①joinをする ②外部キー+CASCADE制約+replace |
【考察】
joinして書いた方が、レベルが上がりそう!
②はすでにやって、かなりカンタンだったが、複合主キーなどに、少し難がある
1.リレーションシップ関係にあるデータの更新
■やりたい事
・複数テーブルにまたがってUPDATEを行う
■検索キーワード
・mysql 複数テーブル 更新
■手法は2つ
①外部キーで関連付けられた別のテーブルのデータを更新
②MySQL 複数テーブルを JOIN してデータを更新 (UPDATE)>>
※JOINの注意点
複数テーブル更新クエリでは、条件を満たす各レコードが更新されます。
基準が複数回一致した場合でも、行は 1 回だけ更新されます。複数のテーブルを更新する構文は、ORDER BY および LIMIT キーワードでは使用できません。
Q,2つの方法があるけれど、どうしたらいいのか??
JOINとcascade+replaceのどちらを利用するのか??
2. JOINを利用
- JOINを使用する方法
この方法では、外部キーで結合されたテーブルのデータをJOINし、更新するデータを含む新しい値を設定し、UPDATEクエリを実行します。
CREATE TABLE orders (
CREATE TABLE customers (
ALTER TABLE orders ADD CONSTRAINT fk_orders_customers |
ここで、ordersテーブルのcustomer_id列がcustomersテーブルのid列と外部キーで結合されています。
ordersテーブルのある行のcustomer_idを更新するには、以下のようなSQLクエリを実行します。
UPDATE orders |
この例では、ordersテーブルのcustomer_idが2に変更され、customersテーブルの対応する行の「email」が更新されます。
3. ON UPDATE CASCADE
- 外部キー制約のON UPDATE CASCADEを使用する方法
外部キー制約を設定して、ON UPDATE CASCADEオプションを使用することで、関連するテーブルのすべての行が自動的に更新されます。
例えば、以下のようなordersテーブルがあるとします。
CREATE TABLE orders ( |
ここで、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'; |
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 |
まとめ
無理せず、楽しく、生産的に働きましょう!ご相談は下記まで
この記事を読んだ人は、こんな記事も読んでいます
■ 基本編 ■
■テーブル・カラム
正規化とは?
ER図
■基本操作■
更新する (UPDATE)
CURDについて
■PhpMyadmin
SQL文を入れる
データを消す
検索する
■csv
■基本の操作02■
制約について知ろう
ビューとは何か?
アップデートについて
■ 設計について■
UMLとは何か?
ER図を覚えよう
■アンチパターン
論理削除
ジェイウォーク(交差テーブルを作らない)
1文字エイリアス
全部小文字
複数列属性(マルチカラムアトリビュート)
パスワード
フラグの闇
■アップロード
SEO対策の基本 外部要因とは?
SEO対策の基本的である、外部要因とは何か?
SEO対策をするなら絶対に知っておきたい、基本知識です。
売れるサイトを作るのに知って起きたい知識
サーチエンジンマーケティングという言葉をご存知でしょうか?
ホームページで商品やサービスを売る時に知っておきたいマーケティング
についてご紹介いたします。
SEO対策をする5つのメリットとは?
なぜ上位表示させることが大事なのか?なぜSEO対策をする必要があるのか
についてご紹介させていただきます。
SEO対策の内部要因とは?
上位表示させるためには、内部要因について知っておくことも大事です。
キーワードを上位表示させるために必要なのは、ソースコードを最適化することです
内部要因の対策について知りたい方はこちらへ
キーワード対策をする前に
そのキーワード対策。ちょっと待ってください。
そのまま対策をすると、必ずお金を損してしまいます。個人事業主や中小企業は
そんな大きなキーワードで対策をしてはいけません。
広告費用が高くなる本当の理由とは?
売れないサイトに集めていませんか?広告費用がかかるわりには
お問い合わせが少ない・・・と感じる方は多いはずです。
購入率の悪いサイトに集客をしている可能性があります。