質問: MySQLで親テーブルの更新/削除の時の挙動で、 ON DELETE ON UPDATE をそれぞれCASCADEに設定しました。 親テーブルを削除すると、紐付いている子テーブルも更新削除されるようになったのですが、子テーブルをUPDATEをしようとするとエラーになってしまいました。 今、手元にエラー文が無いのですが、ON DELETE、ON UPDATE をCASCADEにしたことが原因のようです。 これを回避するにはどうすればいいのでしょうか? 親テーブル id name 子テーブル id parent_id(親テーブルid) NULL有り name
回答: まずは ``` create table parent(pid int primary key,pname varchar(20)); create table child(cid int primary key,cname varchar(20),pid int,foreign key(pid) references parent(pid) on delete cascade on update cascade); insert into parent values(1,'p1'),(2,'p2'),(3,'p3'),(4,'p4'); insert 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); ``` その上で ``` delete from parent where pid=2;//childの4,5が削除 update parent set pid=5 where pid=3;//childの6,7のpidが5に変わる ``` ここまではOKですか? ここで ``` update child set pid=4 where cid=6;//cid=6のpid=5を4に変える ``` parentにpid=4が存在するのでOK ``` update child set pid=6 where cid=7;//cid=7のpid=5を6に変える ``` parentに存在しないpidに変更しようとしても誓約にひっかかります