복붙노트

[SQL] 삭제하거나 부모 행을 업데이트 할 수 없습니다 : 외래 키 제약 조건이 실패

SQL

삭제하거나 부모 행을 업데이트 할 수 없습니다 : 외래 키 제약 조건이 실패

때하고는 :

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`);

해결법

  1. ==============================

    1.이기 때문에 당신이 작업 테이블 그것이 참조의 행을 삭제하기 전에, 당신은 광고주 테이블에서 행을 삭제해야합니다. 이:

    이기 때문에 당신이 작업 테이블 그것이 참조의 행을 삭제하기 전에, 당신은 광고주 테이블에서 행을 삭제해야합니다. 이:

    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`);
    

    당신이 외래 키 관계를 수정하면, 당신의 삭제 문은 작동합니다.

  2. ==============================

    2.간단한 방법은 외부 키 체크를 해제하는 것입니다; 외래 키 검사를 다시 활성화 한 다음 변경합니다.

    간단한 방법은 외부 키 체크를 해제하는 것입니다; 외래 키 검사를 다시 활성화 한 다음 변경합니다.

    SET FOREIGN_KEY_CHECKS=0; -- to disable them
    SET FOREIGN_KEY_CHECKS=1; -- to re-enable them
    
  3. ==============================

    3.당신이 작업 테이블 그것이 참조의 행을 삭제하기 전에 현재 (아마도 결함) 디자인에서, 당신은 광고주 테이블의 행을 삭제해야합니다.

    당신이 작업 테이블 그것이 참조의 행을 삭제하기 전에 현재 (아마도 결함) 디자인에서, 당신은 광고주 테이블의 행을 삭제해야합니다.

    또는 부모 테이블에서 삭제가 자식 테이블의 행이 자동으로 삭제됩니다 있도록 외국 키를 설정할 수 있습니다. 이것은 계단식 삭제라고합니다. 그것은 다음과 같은 :

    ALTER TABLE `advertisers`
    ADD CONSTRAINT `advertisers_ibfk_1`
    FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`)
    ON DELETE CASCADE;
    

    광고주 테이블 정말 기본 키를 포함하고 작업 테이블이 외래 키를 포함하고 있기 때문에 다른 사람들이 이미 지적한대로, 그런 말을하는 데, 그것과 같은 당신의 외래 키 Feel로 다른 방법으로 주위를 가야한다. 나는 이런 식으로 재 작성합니다 :

    ALTER TABLE `jobs`
    ADD FOREIGN KEY (`advertiser_id`) REFERENCES `advertisers` (`advertiser_id`);
    

    그리고 계단식 삭제가 필요하지 않습니다.

  4. ==============================

    4.테이블을 삭제하고 싶은 경우에 당신은 한 단계에서 다음 쿼리를 실행해야

    테이블을 삭제하고 싶은 경우에 당신은 한 단계에서 다음 쿼리를 실행해야

    SET FOREIGN_KEY_CHECKS = 0; DROP의 표 TABLE_NAME;

  5. ==============================

    5.나는 당신의 외래 키 거꾸로라고 생각합니다. 시험:

    나는 당신의 외래 키 거꾸로라고 생각합니다. 시험:

    ALTER TABLE 'jobs'
    ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `advertisers` (`advertiser_id`)
    
  6. ==============================

    6.같은 광고주 ID를 가진 두 개 이상의 작업이있는 경우, 다음 외래 키가 있어야한다 :

    같은 광고주 ID를 가진 두 개 이상의 작업이있는 경우, 다음 외래 키가 있어야한다 :

    ALTER TABLE `jobs`
    ADD CONSTRAINT `advertisers_ibfk_1` 
    FOREIGN KEY (`advertiser_id`) 
    REFERENCES `advertisers` (`advertiser_id`);
    

    그렇지 않으면 (있는 경우 그 귀하의 경우 다른 방식 라운드), 당신은 작업의 행이 외부 키의 끝에 'DELETE CASCADE ON'옵션을 추가 삭제 된 경우 광고주의 행이 자동으로 삭제하려는 경우 :

    ALTER TABLE `advertisers`
    ADD CONSTRAINT `advertisers_ibfk_1` 
    FOREIGN KEY (`advertiser_id`) 
    REFERENCES `jobs` (`advertiser_id`)
    ON DELETE CASCADE;
    

    외래 키 제약 조건을 확인

  7. ==============================

    7.나는 @Alino Manzi는 언급 솔루션을 시도하지만 wpdb를 사용하여 워드 프레스 관련 테이블에 나를 위해 작동하지 않았다.

    나는 @Alino Manzi는 언급 솔루션을 시도하지만 wpdb를 사용하여 워드 프레스 관련 테이블에 나를 위해 작동하지 않았다.

    그때 나는 다음과 같이 코드를 수정하고 일했다

    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
    
  8. ==============================

    8.당신은 순서에 따라이를 삭제해야 표에 의존성이 있습니다

    당신은 순서에 따라이를 삭제해야 표에 의존성이 있습니다

  9. ==============================

    9.당신은 데이터베이스를 만들거나 테이블을 만들 때

    당신은 데이터베이스를 만들거나 테이블을 만들 때

    당신은 상단 스크립트에서 그 라인을 데이터베이스 또는 테이블을 만들 추가해야

    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
    

    행운을 빕니다!

  10. ==============================

    10.어떻게 사용하고이 대안에 대한이 : 외래 키가 NULL이 다음 DELETE SET NULL의 ON 선택할 수 있습니다.

    어떻게 사용하고이 대안에 대한이 : 외래 키가 NULL이 다음 DELETE SET NULL의 ON 선택할 수 있습니다.

    개인적으로 나는 불필요한 합병증을 피하기 위해 "DELETE SET NULL의 ON"모두 "ON UPDATE CASCADE"뿐만 아니라 사용하여 선호하지만 세트 당신은 다른 접근을 할 수 있습니다까지. 또한, NULL'ing 외래 키 값은 후자의 리드 합병증은 정확히 거기에 무슨 일이 있었는지 알 수 없습니다 수 있기 때문이다. 그래서이 변경 응용 프로그램 코드가 어떻게 작동하는지에 밀접한 관계에 있어야합니다.

    도움이 되었기를 바랍니다.

  11. ==============================

    11.나도 laravel 마이그레이션에서이 문제가 있었다 아래에서 드롭 테이블 () 메소드가 중요합니까의 순서

    나도 laravel 마이그레이션에서이 문제가 있었다 아래에서 드롭 테이블 () 메소드가 중요합니까의 순서

    Schema::dropIfExists('groups');
    Schema::dropIfExists('contact');
    

    작동하지만 당신이 순서를 변경하는 경우, 그것을 작동하지 않을 수 있습니다.

    Schema::dropIfExists('contact');
    Schema::dropIfExists('groups');
    
  12. ==============================

    12.당신은 가능한 한 빨리 클라이언트를 지원해야하고,에 대한 액세스 권한이없는 경우

    당신은 가능한 한 빨리 클라이언트를 지원해야하고,에 대한 액세스 권한이없는 경우

    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`);
    

    당신의 자신의 위험에 그래서 이러한 접근 방식의 주요 결함이 수동으로 데이터 무결성을 유지하기 위해 나중에 필요하다는 때문에 그러나, 핫 수정,이다.

  13. ==============================

    13.당신은 작업을 삭제하기 전에에서 참조 된 행을 삭제하는 트리거를 만들 수 있습니다.

    당신은 작업을 삭제하기 전에에서 참조 된 행을 삭제하는 트리거를 만들 수 있습니다.

        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 ;
    
  14. ==============================

    14.이 erorr 오류 코드의 주된 문제 : 1451 삭제하거나 부모 행을 업데이트 할 수 없습니다 : 외래 키 제약 조건이 실패는 충돌을 해결하기 어렵다 그래서, 당신은 테이블이 FK 장애를 포함하는 알려하지 않습니다.

    이 erorr 오류 코드의 주된 문제 : 1451 삭제하거나 부모 행을 업데이트 할 수 없습니다 : 외래 키 제약 조건이 실패는 충돌을 해결하기 어렵다 그래서, 당신은 테이블이 FK 장애를 포함하는 알려하지 않습니다.

    당신은 MySQL의 또는 유사한을 사용하는 경우, 당신은 당신이 검토 할 수 있습니다, 데이터베이스에 대한 ER 다이어그램을 생성하고 안전하게 오류를 트리거 충돌을 제거 할 수 있다는 것을 발견했다.

  15. ==============================

    15.원래, 오류의 이러한 유형의 뒤에 이유는 결국 당신은 기본 키 (루트 테이블) 기본 키 외래 키로 자식 테이블에 사용되는이있는 tupple을 삭제하려고합니다. 당신은 자식 테이블 데이터를 제거 할 필요가 삭제 부모 테이블 데이터를 위해이 시나리오에서는 (이 외래 키가 사용됩니다). 감사

    원래, 오류의 이러한 유형의 뒤에 이유는 결국 당신은 기본 키 (루트 테이블) 기본 키 외래 키로 자식 테이블에 사용되는이있는 tupple을 삭제하려고합니다. 당신은 자식 테이블 데이터를 제거 할 필요가 삭제 부모 테이블 데이터를 위해이 시나리오에서는 (이 외래 키가 사용됩니다). 감사

  16. ==============================

    16.어쩌면 당신은 DELETE CASCADE ON 시도해야

    어쩌면 당신은 DELETE CASCADE ON 시도해야

  17. from https://stackoverflow.com/questions/1905470/cannot-delete-or-update-a-parent-row-a-foreign-key-constraint-fails by cc-by-sa and MIT license