2017-10-11 4 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

안녕. rc_logs 테이블에 rc_teammates 테이블에없는 user_id 항목이있는 데이터가있을 수 있습니까? (나는 당신이 이미 auto_increment 오프셋 때문에 데이터를 가지고 있다고 가정한다) – Ossip

+0

외래 키를 위반하는 항목을 찾으려면 다음과 같이 시도해 보라.'rc_logs.userid에 rc_logs를 남겨둔 채로 rc_logs에서 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가하십시오 uid 동일한를 가진,

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

그냥 rc_teammates에 레코드를 추가를 rc_logs에 삽입하려는 레코드의 user_id에 붙여 넣고 다시 시도하십시오. 또한


약이 :
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; 

PRIMARY KEY로 열을 설정

, 그것이 사실상 : UNIQUE, NOT NULLINDEXED. 이 모든 것을 지정할 필요는 없으며 PRIMARY KEY로 충분합니다. 이것은 다른 테이블에서도 유효합니다.

+0

실제로 내가 한 것은 모든 행을 선택하고 삭제 한 것입니다. 나는 외래 키 오류로 시작 했으므로 나는 자르려고 했으므로 해결 방법으로 수행했다고 생각한다. – GrumpyCrouton

+0

내 데이터 배열을'asort'를 사용하여 정렬했을 때 파손 된 것으로 밝혀졌다. 내 동료들에게 열쇠가되는 배열 색인을 재설정했다. . 나는 동일한 색인을 유지하는'uasort '로 바꾸어서 이것을 고쳤다. 그건 그런 두통 x.x이었다. – GrumpyCrouton

관련 문제