>데이터 베이스 >MySQL 튜토리얼 >상위 행을 삭제하거나 업데이트할 수 없습니다. 외래 키 제약 조건이 실패합니다. - MySQL 오류 해결 방법: 상위 행에 외래 키 제약 조건이 있습니다.

상위 행을 삭제하거나 업데이트할 수 없습니다. 외래 키 제약 조건이 실패합니다. - MySQL 오류 해결 방법: 상위 행에 외래 키 제약 조건이 있습니다.

WBOY
WBOY원래의
2023-10-05 08:49:141941검색

Cannot delete or update a parent row: a foreign key constraint fails - 如何解决MySQL报错:父行有外键约束

MySQL 오류 해결 방법: 상위 행에 외래 키 제약 조건이 있으므로 특정 코드 예제가 필요합니다.

MySQL 데이터베이스를 사용하여 개발할 때 다음 오류 메시지가 자주 표시됩니다. "상위 행을 삭제하거나 업데이트할 수 없습니다: 외래 키 제약 조건이 실패했습니다."(상위 행을 삭제하거나 업데이트할 수 없습니다. 외래 키 제약 조건이 존재합니다.)

이 오류 메시지는 일반적으로 다른 테이블의 레코드에서 참조하는 행을 삭제하거나 업데이트하려고 할 때 나타납니다. 이 경우 MySQL은 외래 키 제약 조건에 따라 상위 행에 대한 삭제 또는 업데이트 작업을 방지합니다. 이 문제를 해결하려면 외래 키 제약 조건을 적절하게 처리해야 합니다.

다음은 특정 코드 예제를 통해 이 문제를 해결하는 몇 가지 방법을 제공합니다.

  1. 관련 하위 행 데이터 삭제
    삭제 또는 업데이트 작업을 수행하기 전에 상위 행과 관련된 하위 행 데이터를 삭제해야 합니다. 이는 외래 키의 ON DELETE CASCADE 속성을 설정하여 달성할 수 있습니다. 상위 행이 삭제되면 상위 행을 참조하는 모든 하위 행도 자동으로 삭제됩니다.

예를 들어 ordersorder_items라는 두 개의 테이블이 있다고 가정해 보겠습니다. order_items 테이블의 order_id 필드는 orders 테이블의 주문에 대한 외래 키 참조입니다. orders 테이블에서 주문을 삭제하려면 먼저 order_items 테이블에서 해당 주문과 관련된 하위 행 데이터를 삭제해야 합니다. ordersorder_itemsorder_items表的order_id字段是对orders表中订单的外键引用。当我们要删除orders表中的某个订单时,必须先删除order_items表中与该订单相关的子行数据。

具体代码示例如下:

CREATE TABLE orders(
    id INT PRIMARY KEY,
    order_name VARCHAR(50)
);

CREATE TABLE order_items(
    id INT PRIMARY KEY,
    order_id INT,
    item_name VARCHAR(50),
    FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE
);

在上面的代码中,我们在创建order_items表时将order_id字段设置为对orders表的外键约束,并指定了ON DELETE CASCADE。这样,当我们删除orders表中的某个订单时,与该订单相关的order_items表中的记录也会被自动删除。

  1. 解除外键约束后删除
    如果我们不希望设置ON DELETE CASCADE,或者无法删除与父行相关的子行数据,我们可以先解除外键约束,然后再进行删除操作。

具体代码示例如下:

ALTER TABLE order_items DROP FOREIGN KEY fk_order_items_order_id;

上面的代码中,我们使用ALTER TABLE语句来删除order_items表中对orders表的外键约束。

接下来,我们可以执行删除操作,如下所示:

DELETE FROM orders WHERE id = 1;

在执行上面的删除语句时,MySQL将不再验证与被删除行相关的外键约束,从而成功删除父行。

  1. 更新父行的值
    在某些情况下,我们可能只想更新父行的值而不是删除它。在这种情况下,我们需要先更新与该父行相关的所有子行的外键引用,然后再更新父行的值。

具体代码示例如下:

UPDATE order_items SET order_id = 2 WHERE order_id = 1;
UPDATE orders SET id = 2 WHERE id = 1;

在上面的代码中,我们首先更新order_items表中的外键引用,将之前引用父行ID为1的记录的order_id字段值更新为2。然后,我们再更新orders

구체적인 코드 예시는 다음과 같습니다.

rrreee

위 코드에서는 order_items 생성 시 order_id 필드를 orders로 설정했습니다. 테이블에 대한 외래 키 제약 조건이 있고 ON DELETE CASCADE가 지정되어 있습니다. 이런 방식으로 orders 테이블에서 주문을 삭제하면 해당 주문과 관련된 order_items 테이블의 기록도 자동으로 삭제됩니다.

    외래 키 제약 조건 해제 후 삭제

    ON DELETE CASCADE를 설정하고 싶지 않거나 상위 행과 관련된 하위 행 데이터를 삭제할 수 없는 경우 먼저 외래 키 제약 조건을 해제하면 됩니다. 그런 다음 삭제하십시오.

    🎜🎜구체적인 코드 예시는 다음과 같습니다. 🎜rrreee🎜위 코드에서는 ALTER TABLE 문을 사용하여 order_items의 <code>orders 테이블을 삭제했습니다. 테이블 외래 키 제약 조건. 🎜🎜다음으로 아래와 같이 삭제 작업을 수행할 수 있습니다. 🎜rrreee🎜 위의 삭제 문을 실행하면 MySQL은 더 이상 삭제된 행과 관련된 외래 키 제약 조건을 검증하지 않으므로 상위 행이 성공적으로 삭제됩니다. 🎜
      🎜상위 행 값 업데이트🎜어떤 경우에는 상위 행을 삭제하는 대신 상위 행의 값만 업데이트하고 싶을 수도 있습니다. 이 경우 상위 행의 값을 업데이트하기 전에 해당 상위 행과 관련된 모든 하위 행의 외래 키 참조를 업데이트해야 합니다. 🎜🎜🎜구체적인 코드 예는 다음과 같습니다. 🎜rrreee🎜위 코드에서는 먼저 order_items 테이블의 외래 키 참조를 이전에 상위 레코드를 참조했던 order_id로 업데이트합니다. 행 ID는 1입니다. 필드 값이 2로 업데이트됩니다. 그런 다음 orders 테이블에서 ID가 1인 레코드의 값을 2로 업데이트합니다. 🎜🎜이런 식으로 상위 행의 값을 성공적으로 업데이트했습니다. 🎜🎜요약: 🎜🎜MySQL 오류: "상위 행을 삭제하거나 업데이트할 수 없습니다. 외래 키 제약 조건이 실패합니다."가 발생하면 상위 행과 관련된 하위 행 데이터를 삭제하고 외래 키 제약 조건을 해제하여 삭제하거나 업데이트할 수 있습니다. 이 문제를 해결하려면 상위 행의 값을 사용하세요. 특정 비즈니스 요구 사항 및 데이터 작업 조건에 따라 해당 처리 방법을 선택하고 외래 키 제약 조건 문제를 처리하기 위한 합리적인 코드를 작성합니다. 🎜

위 내용은 상위 행을 삭제하거나 업데이트할 수 없습니다. 외래 키 제약 조건이 실패합니다. - MySQL 오류 해결 방법: 상위 행에 외래 키 제약 조건이 있습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.