상위 행을 삭제하거나 업데이트할 수 없음: 외부 키 제약 조건이 실패합니다.
실행 시:
DELETE FROM `jobs` WHERE `job_id` =1 LIMIT 1
에러:
#1451 - Cannot delete or update a parent row: a foreign key constraint fails
(paymesomething.advertisers, CONSTRAINT advertisers_ibfk_1 FOREIGN KEY
(advertiser_id) REFERENCES jobs (advertiser_id))
테이블은 다음과 같습니다.
CREATE TABLE IF NOT EXISTS `advertisers` (
`advertiser_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`password` char(32) NOT NULL,
`email` varchar(128) NOT NULL,
`address` varchar(255) NOT NULL,
`phone` varchar(255) NOT NULL,
`fax` varchar(255) NOT NULL,
`session_token` char(30) NOT NULL,
PRIMARY KEY (`advertiser_id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
INSERT INTO `advertisers` (`advertiser_id`, `name`, `password`, `email`, `address`, `phone`, `fax`, `session_token`) VALUES
(1, 'TEST COMPANY', '', '', '', '', '', '');
CREATE TABLE IF NOT EXISTS `jobs` (
`job_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`advertiser_id` int(11) unsigned NOT NULL,
`name` varchar(255) NOT NULL,
`shortdesc` varchar(255) NOT NULL,
`longdesc` text NOT NULL,
`address` varchar(255) NOT NULL,
`time_added` int(11) NOT NULL,
`active` tinyint(1) NOT NULL,
`moderated` tinyint(1) NOT NULL,
PRIMARY KEY (`job_id`),
KEY `advertiser_id` (`advertiser_id`,`active`,`moderated`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
INSERT INTO `jobs` (`job_id`, `advertiser_id`, `name`, `shortdesc`, `longdesc`, `address`, `active`, `moderated`) VALUES
(1, 1, 'TEST', 'TESTTEST', 'TESTTESTES', '', 0, 0);
ALTER TABLE `advertisers`
ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`);
간단한 방법은 외부 키 체크를 디세블로 하는 것입니다.변경 후 외부 키 체크를 다시 이니블로 합니다.
SET FOREIGN_KEY_CHECKS=0; -- to disable them
SET FOREIGN_KEY_CHECKS=1; -- to re-enable them
참조하는 작업테이블의 행을 삭제하기 전에 애드버타이즈 테이블에서 행을 삭제해야 합니다.이것은, 다음과 같습니다.
ALTER TABLE `advertisers`
ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`)
REFERENCES `jobs` (`advertiser_id`);
...실제로 그 반대입니다.즉, 광고주보다 먼저 작업 테이블에 기록이 있어야 합니다.따라서 다음을 사용해야 합니다.
ALTER TABLE `jobs`
ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`)
REFERENCES `advertisers` (`advertiser_id`);
외부 키 관계를 수정하면 삭제 스테이트먼트가 기능합니다.
현재의 (결함 가능성이 있는) 설계에서는 참조하는 작업테이블의 행을 삭제하기 전에 애드버타이즈 테이블에서 행을 삭제해야 합니다.
또는 부모 테이블에서 삭제하면 자녀 테이블의 행이 자동으로 삭제되도록 외부 키를 설정할 수 있습니다.이를 계단식 삭제라고 합니다.다음과 같습니다.
ALTER TABLE `advertisers`
ADD CONSTRAINT `advertisers_ibfk_1`
FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`)
ON DELETE CASCADE;
그러나 이미 다른 사람들이 지적했듯이 광고주 테이블에는 기본 키가 포함되어 있고 작업 테이블에는 외부 키가 포함되어 있기 때문에 외부 키는 반대로 되어 있어야 할 것 같습니다.이렇게 다시 씁니다.
ALTER TABLE `jobs`
ADD FOREIGN KEY (`advertiser_id`) REFERENCES `advertisers` (`advertiser_id`);
단계적 삭제는 필요하지 않습니다.
외부 키 체크를 디세블로 하고 변경을 한 후 외부 키 체크를 다시 이니블로 합니다.
SET FOREIGN_KEY_CHECKS=0; -- to disable them
DELETE FROM `jobs` WHERE `job_id` = 1 LIMIT 1
SET FOREIGN_KEY_CHECKS=1; -- to re-enable them
테이블을 드롭하려면 다음 쿼리를 한 번에 실행해야 합니다.
FORNE_KEY_CHECKS=0; DROP TABLE_name;
WordPress 관련 테이블에서 wpdb를 사용하여 @alino Manzi가 언급한 솔루션을 사용해 보았습니다.
그리고 코드를 아래와 같이 수정했고 작동했다.
SET FOREIGN_KEY_CHECKS=OFF; //disabling foreign key
//run the queries which are giving foreign key errors
SET FOREIGN_KEY_CHECKS=ON; // enabling foreign key
당신의 외국 키가 거꾸로 되어 있는 것 같습니다.시험:
ALTER TABLE 'jobs'
ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `advertisers` (`advertiser_id`)
동일한 advertiser_id를 가진 작업이 여러 개 있는 경우 외부 키는 다음과 같습니다.
ALTER TABLE `jobs`
ADD CONSTRAINT `advertisers_ibfk_1`
FOREIGN KEY (`advertiser_id`)
REFERENCES `advertisers` (`advertiser_id`);
그렇지 않으면(사용자의 경우 반대인 경우), 작업의 행을 삭제했을 때 광고주의 행을 자동으로 삭제하려면 외부 키 끝에 'ON DELETE CASCADE' 옵션을 추가합니다.
ALTER TABLE `advertisers`
ADD CONSTRAINT `advertisers_ibfk_1`
FOREIGN KEY (`advertiser_id`)
REFERENCES `jobs` (`advertiser_id`)
ON DELETE CASCADE;
순서대로 삭제해야 합니다. 테이블에 종속성이 있습니다.
데이터베이스 또는 테이블을 작성할 때
데이터베이스 또는 테이블 생성 스크립트의 맨 위에 이 행을 추가해야 합니다.
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=1;
이제 테이블에서 레코드를 삭제하시겠습니까?그럼 너는 라고 써.
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=1;
DELETE FROM `jobs` WHERE `job_id` =1 LIMIT 1
행운을 빕니다.
지금까지 사용하고 있는 이 방법은 어떻습니까?외부 키를 NULL로 하고 나서 ON DELETE SET NULL을 선택합니다.
개인적으로 불필요한 문제를 피하기 위해 "ON UPDATE CASCADE"와 "ON DELETE SET NULL"을 모두 사용하는 것을 선호하지만, 설정에서는 다른 방법을 원할 수 있습니다.또한 NULL의 외부 키 값은 나중에 복잡해질 수 있습니다.왜냐하면 거기서 정확히 무슨 일이 일어났는지 알 수 없기 때문입니다.따라서 이 변경은 애플리케이션 코드의 작동 방식과 밀접하게 관련되어 있어야 합니다.
이게 도움이 됐으면 좋겠다.
나는 라라벨 이행에서도 이 문제가 있었다.
down()으로 됩니다.
Schema::dropIfExists('groups');
Schema::dropIfExists('contact');
동작하지 않을 수도 있지만 순서를 변경하면 동작합니다.
Schema::dropIfExists('contact');
Schema::dropIfExists('groups');
가능한 한 빨리 클라이언트를 지원할 필요가 있으며 액세스 권한이 없는 경우
FOREIGN_KEY_CHECKS
데이터 무결성을 비활성화할 수 있습니다.
1) 외부 키 삭제
ALTER TABLE `advertisers`
DROP FOREIGN KEY `advertisers_ibfk_1`;
2) sql 또는 api를 사용하여 삭제 작업을 활성화합니다.
3) 외부 키를 스키마에 다시 추가합니다.
ALTER TABLE `advertisers`
ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`);
그러나 핫픽스이므로 이러한 접근 방식의 주요 단점은 나중에 데이터 무결성을 수동으로 유지해야 한다는 것입니다.
작업을 삭제하기 전에 에서 참조된 행을 삭제하는 트리거를 생성할 수 있습니다.
DELIMITER $$
CREATE TRIGGER before_jobs_delete
BEFORE DELETE ON jobs
FOR EACH ROW
BEGIN
delete from advertisers where advertiser_id=OLD.advertiser_id;
END$$
DELIMITER ;
Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails
어떤 테이블에 FK 장애가 포함되어 있는지 알 수 없기 때문에 충돌을 해결하기 어렵다는 것입니다.
MySQL 등을 사용하면 데이터베이스용 ER 다이어그램을 작성할 수 있다는 것을 알게 되었습니다.그러면 에러를 유발하는 경합을 확인하고 안전하게 제거할 수 있습니다.
- MySQL 워크벤치 사용
- [ Database ]-> [ Reverse Engineering ]을 클릭합니다.
- 「」를 합니다.
connection
- 까지를 꼭 .
database
&tables
가 필요한 - 이제 ER 다이어그램이 있습니다. FK 충돌이 있는 테이블을 볼 수 있습니다.
이 오류는 Symfony에서 교리 쿼리 언어를 사용하여 작업하는 경우에도 발생할 수 있습니다. 엔티티 파일에 onDelete를 추가했습니다.
/**
* @ORM\ManyToOne(targetEntity=Pricelist::class)
* @ORM\JoinColumn(name="pricelist_id", referencedColumnName="id", onDelete="SET NULL")
*/
캐스케이드 삭제를 시도해 보십시오.
저도 마찬가지여서 다른 테이블의 종속성과 참조로 인해 엔트리를 삭제할 수 없었습니다.테이블에 삭제 컬럼(부울형)을 추가했습니다.이 필드의 값은 항목이 삭제 표시되었는지 여부를 보여 줍니다.삭제 마크가 붙어 있으면 가져오거나 사용하지 않고, 그렇지 않으면 사용됩니다.
언급URL : https://stackoverflow.com/questions/1905470/cannot-delete-or-update-a-parent-row-a-foreign-key-constraint-fails
'programing' 카테고리의 다른 글
MySQL에서 사용 가능한 데이터 유형 나열 (0) | 2022.12.21 |
---|---|
기존 콜백 API를 약속으로 변환하려면 어떻게 해야 합니까? (0) | 2022.12.11 |
MySQL 테이블이 마지막으로 업데이트된 날짜를 확인하려면 어떻게 해야 합니까? (0) | 2022.12.11 |
PHP cURL을 사용하여 JSON 데이터를 게시하는 방법 (0) | 2022.12.11 |
문자열을 n자 세그먼트로 분할하려면 어떻게 해야 합니까? (0) | 2022.12.11 |