Mysql 오류 1452 - 하위 행을 추가하거나 업데이트할 수 없습니다. 외부 키 제약 조건이 실패합니다.
좀 이상한 문제가 있어요.다른 테이블을 참조하는 외부 키를 추가하려고 하는데 어떤 이유로 인해 실패합니다.MySQL에 대한 지식이 부족하기 때문에 다른 테이블에 참조하려는 외부 키가 있을 수 있습니다.
한 짓은 다 했어SHOW CREATE TABLE는 두 " " " 입니다.sourcecodes_tags키인 입니다.sourcecodes을 사용하다
CREATE TABLE `sourcecodes` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) unsigned NOT NULL,
`language_id` int(11) unsigned NOT NULL,
`category_id` int(11) unsigned NOT NULL,
`title` varchar(40) CHARACTER SET utf8 NOT NULL,
`description` text CHARACTER SET utf8 NOT NULL,
`views` int(11) unsigned NOT NULL,
`downloads` int(11) unsigned NOT NULL,
`time_posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `language_id` (`language_id`),
KEY `category_id` (`category_id`),
CONSTRAINT `sourcecodes_ibfk_3` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
CREATE TABLE `sourcecodes_tags` (
`sourcecode_id` int(11) unsigned NOT NULL,
`tag_id` int(11) unsigned NOT NULL,
KEY `sourcecode_id` (`sourcecode_id`),
KEY `tag_id` (`tag_id`),
CONSTRAINT `sourcecodes_tags_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
에러를 생성하는 코드는 다음과 같습니다.
ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE
아마 당신의sourcecodes_tags테이블에는 다음이 포함됩니다.sourcecode_id 하지 않는 값sourcecodes식탁부터 치워야 돼
다음은 해당 ID를 찾을 수 있는 쿼리입니다.
SELECT DISTINCT sourcecode_id FROM
sourcecodes_tags tags LEFT JOIN sourcecodes sc ON tags.sourcecode_id=sc.id
WHERE sc.id IS NULL;
MySQL 데이터베이스에서도 같은 문제가 발생했지만, 마침내 나에게 맞는 해결책을 찾았습니다.
mysql 관점에서는 모든 것이 정상이었기 때문에(두 테이블 모두 InnoDB 엔진을 사용해야 하며 각 컬럼의 데이터 유형은 외부 키 제약에 관여하는 동일한 유형이어야 합니다).
다만, 외부 키 체크를 무효로 하고, 나중에 외부 키 조작을 실행한 후에 유효하게 했을 뿐입니다.
다음 중 하나:
SET foreign_key_checks = 0;
alter table tblUsedDestination add constraint f_operatorId foreign key(iOperatorId) references tblOperators (iOperatorId); Query
OK, 8 rows affected (0.23 sec) Records: 8 Duplicates: 0 Warnings: 0
SET foreign_key_checks = 1;
NOT IN제약조건이 구속되는 위치를 찾으려면:
SELECT column FROM table WHERE column NOT IN
(SELECT intended_foreign_key FROM another_table)
구체적으로는 다음과 같습니다.
SELECT sourcecode_id FROM sourcecodes_tags WHERE sourcecode_id NOT IN
(SELECT id FROM sourcecodes)
집::IN ★★★★★★★★★★★★★★★★★」NOT IN는 '연산자'보다 있습니다.JOIN연산자뿐만 아니라 구성 및 반복이 훨씬 용이합니다.
테이블을 잘라낸 다음 FK 구속조건을 추가하십시오.
이 솔루션이 좀 어색하다는 것을 알지만 100% 효과가 있습니다.하지만 이것이 문제를 해결하는 데 이상적인 해결책은 아니라는 것에는 동의하지만 도움이 되었으면 합니다.
저에게 이 문제는 조금 달랐고 확인과 해결이 매우 쉬웠습니다.
두 테이블이 모두 InnoDB인지 확인해야 합니다.1개의 테이블, 즉 참조 테이블이 MyISAM일 경우 제약조건은 실패합니다.
SHOW TABLE STATUS WHERE Name = 't1';
ALTER TABLE t1 ENGINE=InnoDB;
이 문제는 child.column 값이 이미0 이며 parent.id 값이 0 이 아닌 경우 외부 키를 child.column 으로 설정할 때도 발생합니다.
각 child.column이 NULL이거나 parent.id에 있는 값을 가지고 있는지 확인해야 합니다.
그리고 지금 내가 no라고 쓴 성명서를 읽었을 때, 그것이 그가 입증하고 있는 것이다.
저도 오늘 같은 문제가 있었어요.4가지를 테스트했습니다.그 중 몇 가지는 이미 여기에 기재되어 있습니다.
자녀 열에 부모 열에 존재하지 않는 값이 있습니까(자녀 열이 NULL인 경우 NULL 이외)?
하위 열과 상위 열의 데이터 유형이 같습니까?
참조하는 상위 열에 색인이 있습니까?MySQL에서는 퍼포먼스상의 이유로 이것이 필요한 것 같습니다(http://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html)
그리고 이 문제로 해결되었습니다.두 테이블 모두 동일한 데이터 정렬이 이루어집니까?
한 테이블은 UTF-8이고 다른 테이블은 iso-something에 있습니다.그게 안 먹혔어.iso-table을 UTF-8 대조로 변경한 후 제약조건을 문제없이 추가할 수 있었습니다.제 경우, phpMyAdmin은 외부 키 제약조건을 작성하기 위한 드롭다운에 iso-encoding의 하위 테이블도 표시하지 않았습니다.
열 0에 유효한 외부 키가 아닌 잘못된 값이 있는 것 같으므로 MySQL은 해당 열에 대한 외부 키 제약 조건을 설정할 수 없습니다.
다음의 순서를 실행할 수 있습니다.
FK 구속조건을 설정하려는 열을 놓습니다.
다시 추가하고 기본값을 NULL로 설정합니다.
외부 키 제약 조건을 다시 설정해 보십시오.
마찬가지로 테이블의 행을 확인했는데 외부 키를 정의하려는 필드 값과 호환되지 않는 것이 발견되었습니다.그 값을 수정하고 다시 시도하면 문제가 해결되었습니다.
테이블에 있는 모든 데이터를 삭제하고 다시 change를 실행합니다.그건 효과가 있다.뛰어난 어플리케이션은 아니지만 많은 시간을 절약할 수 있습니다.특히 어플리케이션은 아직 고객 데이터 없이 개발 단계에 있습니다.
이거 먹어봐
SET foreign_key_checks = 0;
ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE
SET foreign_key_checks = 1;
세 번 정도 똑같은 문제를 겪었어요.어느 경우든 내 레코드 중 하나(또는 그 이상)가 새로운 외부 키와 일치하지 않았기 때문입니다.키 자체를 추가하기 전에 외부 키의 구문 제약에 따라 기존 레코드를 업데이트할 수 있습니다.다음 예제에서는 일반적으로 문제 레코드를 분리해야 합니다.
SELECT * FROM (tablename)
WHERE (candidate key) <> (proposed foreign key value)
AND (candidate key) <> (next proposed foreign key value)
AND (candidate key) <> (next proposed foreign key value)" " " " " " " " " "이렇게 하면 안 돼요"
레코드가 많으면 어려울 수 있지만 테이블이 꽤 작으면 오래 걸리지 않을 것입니다.SQL 구문은 그다지 뛰어나지 않지만, 이 때문에 항상 문제가 격리되어 있었습니다.
두 테이블의 데이터를 모두 비우고 명령을 실행합니다.그건 작동할 것이다.
이 에러는 Larabel과 언변이 좋으면 외부 키 링크를 시도하면 1452가 됩니다.링크된 테이블의 데이터 부족이 문제였습니다.
예에 대해서는, http://mstd.eu/index.php/2016/12/02/laravel-eloquent-integrity-constraint-violation-1452-foreign-key-constraint/ 를 참조해 주세요.
한 가지 질문만 대답하면 됩니다.
테이블에는 이미 데이터가 저장되어 있습니까? (특히 테이블에는 외부 키가 포함되어 있습니다.)
대답이 "예"인 경우 모든 레코드를 삭제하기만 하면 테이블에 외부 키를 추가할 수 있습니다.
삭제 명령:하위(외부 키 테이블 포함)에서 상위 테이블로 이동합니다.
데이터 입력 후 외부 키를 추가할 수 없는 이유는 테이블의 불일치 때문인데, 데이터가 가득 찬 기존 외부 키에 대해서는 어떻게 대처하시겠습니까?
"아니오"라고 대답할 경우 다른 지침을 따르십시오.
이 솔루션을 준비하고 있었는데 이 예가 도움이 될 수 있습니다.
데이터베이스에는 ID의 프라이머리 키가 있는2개의 테이블(이메일 및 credit_card)이 있습니다.다른 테이블(클라이언트)에서는 이 테이블 ID를 외부 키라고 부릅니다.고객 데이터와는 별도로 메일을 보내야 할 이유가 있습니다.
먼저 참조된 테이블(email, credit_card)의 행 데이터를 삽입하고 각 테이블의 ID를 얻습니다.이 ID는 세 번째 테이블(클라이언트)에 필요합니다.
참조된 테이블에 행을 먼저 삽입하지 않으면 MySQL은 외부 키를 참조하는 세 번째 테이블에 새 행을 삽입할 때 대응할 수 없습니다.
참조된 테이블에 대해 참조된 행을 먼저 삽입한 후 외부 키를 참조하는 행을 삽입하면 오류가 발생하지 않습니다.
이게 도움이 됐으면 좋겠다.
값이 다른 테이블에 있는지 확인하십시오.그렇지 않으면 할당된 해당 열에 이 오류가 표시됩니다.
따라서 이 컬럼이 다른 테이블의 행 ID에 할당되어 있는 경우 테이블 내에 행이 있는지 확인하십시오.그렇지 않으면 이 에러가 표시됩니다.
당신은 이 예제를 시도해 볼 수 있다.
START TRANSACTION;
SET foreign_key_checks = 0;
ALTER TABLE `job_definers` ADD CONSTRAINT `job_cities_foreign` FOREIGN KEY
(`job_cities`) REFERENCES `drop_down_lists`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
SET foreign_key_checks = 1;
COMMIT;
주의: phpmyadmin을 사용하는 경우 외부 키 검사 활성화 선택을 취소하십시오.
이솔루션이문제를해결해주길바랍니다:)
UPDATE sourcecodes_tags
SET sourcecode_id = NULL
WHERE sourcecode_id NOT IN (
SELECT id FROM sourcecodes);
그 ID를 없애는 데 도움이 될 겁니다또는 만약null에 들어갈 수 없습니다.sourcecode_id그런 다음 이러한 행을 삭제하거나 누락된 값을 에 추가합니다.sourcecodes테이블.
저도 같은 문제가 있어서 해결책을 찾아서NULL대신NOT NULL[외부 키(Foreign Key Column 。다음은 질문입니다.
ALTER TABLE `db`.`table1`
ADD COLUMN `col_table2_fk` INT UNSIGNED NULL,
ADD INDEX `col_table2_fk_idx` (`col_table2_fk` ASC),
ADD CONSTRAINT `col_table2_fk1`
FOREIGN KEY (`col_table2_fk`)
REFERENCES `db`.`table2` (`table2_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
MySQL이 이 쿼리를 실행했습니다!
내 경우 동일한 구조의 새 테이블을 만들고 다른 테이블과의 관계를 작성한 후 문제가 있는 이전 테이블에서 CSV 내의 데이터를 추출하여 CSV를 새 테이블로 Import하고 외부 키 체크와 Import 중단을 비활성화하면 모든 데이터가 문제가 없는 새 테이블에 삽입됩니다.정상적으로 종료된 후 오래된 테이블을 삭제합니다.
그것은 나에게 효과가 있었다.
언급URL : https://stackoverflow.com/questions/1253459/mysql-error-1452-cannot-add-or-update-a-child-row-a-foreign-key-constraint-fa
'source' 카테고리의 다른 글
| @RunWith(Mockito)JUnitRunner.class)와 MockitoAnnotations.initMocks(이것) (0) | 2022.12.31 |
|---|---|
| MySQL의 타임존을 UTC로 설정해야 합니까? (0) | 2022.12.31 |
| bootstrap-vue를 사용한 재스트 실행 (0) | 2022.12.31 |
| MySQL 데이터베이스를 SQLite 데이터베이스로 내보내기 (0) | 2022.12.31 |
| SQL Chemy: 실제 쿼리 인쇄 (0) | 2022.12.21 |
