質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

3回答

3768閲覧

ON DELETE、ON UPDATE をそれぞれCASCADEに設定した時の挙動

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2019/03/13 10:02

MySQLで親テーブルの更新/削除の時の挙動で、
ON DELETE
ON UPDATE をそれぞれCASCADEに設定しました。

親テーブルを削除すると、紐付いている子テーブルも更新削除されるようになったのですが、子テーブルをUPDATEをしようとするとエラーになってしまいました。

今、手元にエラー文が無いのですが、ON DELETE、ON UPDATE をCASCADEにしたことが原因のようです。
これを回避するにはどうすればいいのでしょうか?

親テーブル
id
name

子テーブル
id
parent_id(親テーブルid) NULL有り
name

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

まずは

SQL

1create table parent(pid int primary key,pname varchar(20)); 2create table child(cid int primary key,cname varchar(20),pid int,foreign key(pid) references parent(pid) on delete cascade on update cascade); 3insert into parent values(1,'p1'),(2,'p2'),(3,'p3'),(4,'p4'); 4insert into child values(1,'c1-1',1),(2,'c1-2',1),(3,'c1-3',1),(4,'c2-1',2),(5,'c2-2',2),(6,'c3-1',3),(7,'c3-2',3);

その上で

SQL

1delete from parent where pid=2;//childの4,5が削除 2update parent set pid=5 where pid=3;//childの6,7のpidが5に変わる

ここまではOKですか?
ここで

SQL

1update child set pid=4 where cid=6;//cid=6のpid=5を4に変える

parentにpid=4が存在するのでOK

SQL

1update child set pid=6 where cid=7;//cid=7のpid=5を6に変える

parentに存在しないpidに変更しようとしても誓約にひっかかります

投稿2019/03/13 12:20

yambejp

総合スコア114769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/03/14 10:58

ありがとうございました! よく確認したところ、親IDが存在しなくなっていたのが原因でした。
guest

0

子テーブルをUPDATEをしようとするとエラーになってしまいました。

エラーになって当然です。子テーブルから連動して親テーブルまで書き換えるような機能はありません。

…というより、ON DELETE CASCADEはともかく、ON UPDATE CASCADEを恒常的に使わないといけない(関連付けられるキー自体の書き換えが相次ぐ)データベース設計自体に問題があると考えます。

投稿2019/03/13 11:00

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/03/13 11:05

親テーブルはそのままで、子テーブル側のみの値を変えたかったのです。 ON DELETE CASCADE、ON UPDATE CASCADEは親テーブルが変更された時だけ、子テーブルを更新するものではなかったんですね。 ありがとうございます。
maisumakun

2019/03/13 11:07

子テーブル側だけ値を変えたいにしても、(ON UPDATE CASCADEの前提となる)外部キーがかかっている以上は、親テーブルにあるものしか入れられません。
guest

0

現象を再現できるUPDATE、使っているテーブルのCREATE, データを何件かINSERT文、その時表示されたエラーメッセージを質問に追記しては?

たぶん、親テーブルに存在しないキーで子テーブルをUPDATEして、親テーブルにデータがない、って怒られたのでは?

親テーブルの更新/削除の時の挙動

ON DELETE句やON UPDATE句にCASCADEを指定した場合は、親テーブルに対して更新を行うと子テーブルで同じ値を持つカラムの値も合わせて更新されます。また親テーブルに対して削除を行うと子テーブルで同じ値を持つデータが削除されます。

わからないからといって掲示板に質問する前に、使い方くらいググって調べたり、CASCADEを付つけない時の挙動を確認しては?

投稿2019/03/13 10:11

編集2019/03/13 10:49
Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/03/13 10:57

コメントありがとうございます。 再現できるものができましたら修正させていたます。 親テーブルの更新削除は特に問題ないです。親テーブルを更新削除すると、子テーブルも更新削除されます。 今回問題なのは、子テーブル側を更新しようとした時の挙動です。
Orlofsky

2019/03/13 12:22

変更しようとした子テーブルのキーが親テーブルに存在しないのでエラーになったのでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問