2017-10-11 19 views
0

私は最近、外部キーを使用して自分でデータベース管理を簡単にし始めました。私は彼らが実際に働く方法を理解しようとしているひどい時を過ごしています、そして、私はそれを問題なしでテーブル間で働かせることがほとんどです。しかし、私は現在2つのテーブルに問題があります。私はそれを理解できません。外部キー整合性制約違反:1452

私はエラーになっています:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (REDACTED . rc_logs , CONSTRAINT rc_logs_ibfk_1 FOREIGN KEY (user_id) REFERENCES rc_teammates (uid) ON DELETE CASCADE ON UPDATE CASCADE) [/home5/redacted/public_html/redacted/rc/public/assets/php/connection.php:25]

を私のテーブルが適切に設定されているようだ、と私はそれが働いていない理由については本当に困惑しています。ここに私のテーブル構造である:私は、エラーをルックアップするために試した

CREATE TABLE `rc_teammates` (
    `uid` int(11) NOT NULL, 
    `name` text NOT NULL, 
    `primary_line` int(11) NOT NULL, 
    `hireStatus` text NOT NULL, 
    `created_on` date NOT NULL, 
    `active` tinyint(1) NOT NULL DEFAULT '1' 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

ALTER TABLE `rc_teammates` 
    ADD PRIMARY KEY (`uid`), ADD UNIQUE KEY `uid` (`uid`), ADD KEY `primary_line` (`primary_line`), ADD KEY `primary_line_2` (`primary_line`); 

ALTER TABLE `rc_teammates` 
    MODIFY `uid` int(11) NOT NULL AUTO_INCREMENT; 

ALTER TABLE `rc_teammates` 
ADD CONSTRAINT `rc_teammates_ibfk_1` FOREIGN KEY (`primary_line`) REFERENCES `rc_lines` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE; 

rc_logs

CREATE TABLE IF NOT EXISTS `rc_logs` (
    `uid` int(11) NOT NULL, 
    `user_id` int(11) NOT NULL, 
    `line` int(11) NOT NULL, 
    `date` date NOT NULL, 
    `type` varchar(15) NOT NULL, 
    `timein` time NOT NULL, 
    `timeout` time NOT NULL 
) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=latin1; 

ALTER TABLE `rc_logs` 
    ADD PRIMARY KEY (`uid`), ADD KEY `user_id` (`user_id`), ADD KEY `line` (`line`), ADD KEY `user_id_2` (`user_id`); 

ALTER TABLE `rc_logs` 
    MODIFY `uid` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=53; 
ALTER TABLE `rc_logs` 
ADD CONSTRAINT `rc_logs_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `rc_teammates` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE, 
ADD CONSTRAINT `rc_logs_ibfk_2` FOREIGN KEY (`line`) REFERENCES `rc_lines` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE; 

rc_teammates、と私は私が、前にこの問題を持っていました私がそれをどのように解決したか覚えていない。悪い点は、rc_teammatesテーブルを空にして新鮮なものにするまで、これは早くから働いていたことです。

私は本当にこれを理解することができず、どんな指針も愛するでしょう。ありがとう!

+0

hi。 rc_logsテーブルに、rc_teammatesテーブルに存在しないuser_idエントリを持つデータがあるとしますか? (私はすでにauto_incrementオフセットのためにデータを持っていると仮定します) – Ossip

+0

外部キーに違反するエントリを見つけるために、次のようなものを試してください: 'rc_logs.useridでrc_logs.uid、rc_logs.user_id、rc_teammates.uidを残してください。 = rc_teammates.uidがrc_teammates.uidがnullの場合、 ' – Ossip

+0

@Ossip私はデータを間違って空にしたと思います。私はすぐに私のコンピュータにアクセスすることができませんので、すぐにこれを調べます – GrumpyCrouton

答えて

1

あなたは「空になった」(TRUNCATE?)の表rc_teammatesと言ったように。 そして、あなたrc_logsにレコードを挿入しようとすると、このレコードは、以下の制約の違反ので、rc_teammatesに存在しないuser_idがあります

ADD CONSTRAINT `rc_logs_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `rc_teammates` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE 

だけ等しいuidを持つ、rc_teammatesにレコードを追加rc_logsに挿入しようとしているレコードのuser_idに送信し、再試行してください。


はまた、これについて:あなたはPRIMARY KEYとして列を設定した場合

ALTER TABLE `rc_teammates` 
    ADD PRIMARY KEY (`uid`), ADD UNIQUE KEY `uid` (`uid`), 

ALTER TABLE `rc_teammates` 
    MODIFY `uid` int(11) NOT NULL AUTO_INCREMENT; 

、それは事実上のです:UNIQUENOT NULLINDEXED。このすべてを指定する必要はなく、PRIMARY KEYで十分です。これは他のテーブルでも有効です。

+0

実際に私がしたことは、すべての行を選択して削除しました。私はそれが外字キーエラーで始まったと思いますので、私は回避策としてそれをしました – GrumpyCrouton

+0

'asort'を使って自分のデータ配列をソートしたとき、私のチームメイトのキーである配列インデックスをリセットしました。私は同じインデックスを保持する 'uasort'に切り替えることでこれを修正しました。それはそのような頭痛x.xだった – GrumpyCrouton

関連する問題