LoginSignup
6
5

More than 5 years have passed since last update.

CakePHP2以前は複合主キーに対応していない件

Last updated at Posted at 2017-11-16

CakePHP2以前のバージョンでは、複合主キーに対応していません。

回避策

・もし可能であれば、新しいフレームワーク(CakePHP3など)を利用してください。

・もし可能であれば、テーブルの構成を変更してください。
 サロゲートキーを追加するのが2系時代の一番の解法とのこと。

・updateAllで保存する
 updateAllなら主キー以外で保存できるため。

・queryでやっちゃう

現象

複合主キーを持つテーブルを更新しようとすると、
以下のような予期しない動作が起こります。

例では、company_idとmember_idが主キーのテーブルで、
Modelのprimary_keyにmember_idが定義されている場合を示しています。

saveする時に、同じ主キーの片方を持つレコードがupdateされる

例)C社のmemberとして 1001 さんをsaveしたかったのに

company_id(PK) member_id(PK)
S 1001

↓ S社のレコードがupdateされてしまう

company_id(PK) member_id(PK)
C 1001
実行SQL
SELECT COUNT(*) AS `count` FROM `db`.`company_members` AS `CompanyMembers`   WHERE `CompanyMembers`.`member_id` = 1001

UPDATE `db`.`company_members` SET `member_id` = 1001, `company_id` = `C`   WHERE `db`.`company_members`.`member_id` = 1001

deleteする時に、同じ主キーの片方を持つレコードがdeleteされる

例)C社のmember 1001 さんをdeleteしたかったのに

company_id(PK) member_id(PK)
S 1001
C 1001

↓ S社のレコードがdeleteされてしまう

company_id(PK) member_id(PK)
実行SQL
SELECT COUNT(*) AS `count` FROM `db`.`company_members` AS `CompanyMembers`   WHERE `CompanyMembers`.`member_id` = 1001

DELETE `CompanyMembers` FROM `db`.`company_members` AS `CompanyMembers`   WHERE `CompanyMembers`.`member_id` = (1001)
6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5