2

PHP/MySQL + Yii Framework を使用して Web ベースのアプリケーションを開発しています。この問題は、トランザクションの制約チェック エラーとして発生します。

次のテーブルがあります。

ユーザー

CREATE TABLE IF NOT EXISTS `User` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(64) DEFAULT NULL,
  `surname` varchar(64) DEFAULT NULL,
  `email` varchar(128) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  `creation_date` datetime DEFAULT NULL,
  `last_login_date` datetime DEFAULT NULL,
  `status` tinyint(1) DEFAULT '0',
  `level` tinyint(1) DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=40 ;

候補者情報

CREATE TABLE IF NOT EXISTS `CandidateInfo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `candidate_status_id` int(11) DEFAULT NULL,
  `name` varchar(64) DEFAULT NULL,
  `surname` varchar(64) DEFAULT NULL,
  `email` varchar(128) DEFAULT NULL,
  `gender` tinyint(1) DEFAULT '0',
  `date_of_birth` datetime DEFAULT NULL,
  `home_phone` varchar(20) DEFAULT NULL,
  `mobile_phone` varchar(20) DEFAULT NULL,
  `creation_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `rating` tinyint(1) DEFAULT '0',
  `location` varchar(100)DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FK_candidateinfo_user` (`id`),
  KEY `FK_candidateinfo_candidatestatus` (`candidate_status_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=26 ;

基本的に、新しい行をUserテーブルに追加してから、挿入 ID を使用して新しい行をCandidateInfoテーブル (user_id 列)に追加しようとしています。

PHPコードは次のとおりです

$transaction = Yii::app()->db->beginTransaction();
try {
    $user->save();
    $candidate->setAttribute('user_id', $user->id);
    $candidate->save();
    $transaction->commit();
} catch (Exception $e) {
    $transaction->rollBack();
    var_dump($e->getMessage());
}

エラーは次のとおりです。

 SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`origo`.`CandidateInfo`, CONSTRAINT `FK_candidateinfo_user` FOREIGN KEY (`id`) REFERENCES `User` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION). The SQL statement executed was: INSERT INTO `CandidateInfo` (`gender`, `rating`, `name`, `surname`, `email`, `date_of_birth`, `home_phone`, `mobile_phone`, `user_id`) VALUES (:yp0, :yp1, :yp2, :yp3, :yp4, :yp5, :yp6, :yp7, :yp8)

mysql クエリ ログを確認すると、CandidateInfo テーブルの INSERT ステートメントに正しい user_id が使用されていることがわかります。しかし、上記のエラーで失敗します。私の理解では、それは機能するはずですが、間違っている可能性があり、これはトランザクションが機能する方法ではありません。

どちらのテーブルも InnoDB です。

前もって感謝します。

編集: FK関係を貼り付けるのを忘れてすみません。

ALTER TABLE `CandidateInfo`
  ADD CONSTRAINT `FK_candidateinfo_candidatestatus` FOREIGN KEY (`candidate_status_id`) REFERENCES `CandidateStatus` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  ADD CONSTRAINT `FK_candidateinfo_user` FOREIGN KEY (`id`) REFERENCES `User` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
4

2 に答える 2

4
ALTER TABLE `CandidateInfo`
  ADD CONSTRAINT `FK_candidateinfo_candidatestatus` FOREIGN KEY (`candidate_status_id`) REFERENCES `CandidateStatus` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  ADD CONSTRAINT `FK_candidateinfo_user` FOREIGN KEY (`id`) REFERENCES `User` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;

する必要があります

ALTER TABLE `CandidateInfo`
  ADD CONSTRAINT `FK_candidateinfo_candidatestatus` FOREIGN KEY (`candidate_status_id`) REFERENCES `CandidateStatus` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  ADD CONSTRAINT `FK_candidateinfo_user` FOREIGN KEY (`user_id`) REFERENCES `User` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;

あなたはあなたのID参照IDを持っています。

于 2012-07-11T13:30:37.967 に答える
3

あなたのエラースタック:

SQLSTATE [23000]: 整合性制約違反: 1452 子行を追加または更新できません: 外部キー制約が失敗しました ( origo. CandidateInfo, CONSTRAINT FK_candidateinfo_userFOREIGN KEY ( id) REFERENCES User( id) ON DELETE NO ACTION ON UPDATE NO ACTION)。

実行された SQL ステートメントは次のとおりです。

INSERT INTO `CandidateInfo`
( `gender`, `rating`, `name`, `surname`, `email`, 
  `date_of_birth`, `home_phone`, `mobile_phone`, `user_id`
)
VALUES ( :yp0, :yp1, :yp2, :yp3, :yp4, :yp5, :yp6, :yp7, :yp8 )

あなたのCandidateInfoテーブルはidフィールドをauto_increment主キーフィールドと外部キーとして定義しています。
そして、あなたのステートメントには、その親テーブルから読み取られたinsertが含まれていません。 したがって、挿入時に新しい値がテーブルに生成され、適用されます。親テーブル の主キー値のいずれとも一致しなかったため、どのインターンが失敗しましたか。iduser
idcandidateinfo
iduser

したがって、エラーです。

注意:
子テーブルでマスターの pk フィールドを外部キー フィールドとして参照する
場合は、申請せずauto_incrementに参照してください。


構造をよく見ると、フィールドにマップしcandidateinfoたくなるかもしれません。適切な外部キー定義を使用してその変更を行うと、問題が解決します。use_iduser.id

于 2012-07-11T13:31:34.890 に答える