2014-11-02 2 views
2

나는이 오류를 찾고 동일한 성격의 몇 가지 질문을 발견했으나 이해할 수는 있습니다. UPDATING issue에 관심이 있습니다. 내 물건은 입장 취소 중입니다. 그런 다음오류 1451 : 1451 : 부모 행을 삭제하거나 업데이트 할 수 없습니다. 외래 키 제약 조건이 적용되지 않습니다.

CREATE TABLE `product` (
    `product_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT 
'represents unique identifier for every existing products', 
    `code` varchar(20) NOT NULL, 
    `name` varchar(45) NOT NULL COMMENT 'description', 
    `price` decimal(11,4) NOT NULL, 
    `short_name` varchar(10) NOT NULL COMMENT 
'name that can be used quickly to referenc or immediately know what is the product', 
    `count` bigint(19) unsigned NOT NULL DEFAULT '0', 
    `product_type_id` smallint(5) unsigned NOT NULL DEFAULT '0', 
    `is_active` bit(1) NOT NULL DEFAULT b'0', 
    PRIMARY KEY (`product_id`), 
    KEY `product_product_typeFK_idx` (`product_type_id`), 
    CONSTRAINT `product_product_typeFK` FOREIGN KEY (`product_type_id`) REFERENCES 
`product_type` (`product_type_id`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; 

그것은 또한이 일부 일부 데이터 삽입 TRIGGER 동반 : 'product_audit'의 구조뿐만 아니라 여기

USE `RFVPOS`; 
DELIMITER $$ 
CREATE TRIGGER `Product_BDEL` BEFORE DELETE ON `product` FOR EACH ROW 

BEGIN 
    INSERT INTO `product_audit` 
    (product_id, 
    code, 
    name, 
    short_name, 
    price, 
    count, 
    delete_user, 
    delete_date 
    ) 

    values 
    (OLD.product_id, 
    OLD.code, 
    OLD.name, 
    OLD.short_name, 
    OLD.price, 
    OLD.count, 
    CURRENT_USER(), 
    NOW() 
    ); 
END 

입니다 :

여기

어떻게 내 테이블이 구성되어있어

CREATE TABLE `product_audit` (
    `product_audit_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, 
    `product_id` mediumint(8) unsigned NOT NULL, 
    `code` varchar(20) NOT NULL, 
    `name` varchar(45) NOT NULL, 
    `price` decimal(11,4) NOT NULL, 
    `short_name` varchar(10) NOT NULL, 
    `count` bigint(19) unsigned NOT NULL, 
    `delete_user` varchar(45) NOT NULL, 
    `delete_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`product_audit_id`), 
    KEY `product_audit_productFK_idx` (`product_id`), 
    CONSTRAINT `product_audit_productFK` FOREIGN KEY (`product_id`) REFERENCES `product` (`product_id`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8; 

그런 다음이 오류가 깜박입니다 :

ERROR 1451: 1451: Cannot delete or update a parent row: a foreign key constraint fails

이제는 '제품'테이블에서 삭제할 항목을 다른 테이블 항목이 사용하지 못했습니다. 이 삭제는 원활하게 진행됩니다.

그래서 '제품'테이블과 BLAM에서 트리거를 제거하려고 시도했지만 삭제가 성공했습니다.
이것은 내 오류가 트리거에 있음을 의미합니다. 정확하게 (트리거가 아닌 경우) 어디에서 오류가 발생했는지 알려줄 수 있습니까?

답변

4

제품을 삭제하기 전에 트리거가 product_audit에 삽입됩니다. product_audit에있는 product_id 열이 product에 대한 외래 키인 경우 product_audit에 새로 생성 된 행의 부모이므로이 행을 더 이상 product에서 삭제할 수 없습니다.

product_audit에서 외래 키 제약 조건을 제거해보십시오.

product_audit에 대한 테이블 정의를 표시하지 않았으므로 위와 같은 점을 추측합니다. (글을 쓰는 시점에서 그렇습니다.하지만 제 추측은 옳았습니다!)

+0

이 대답은 분명했습니다. BTW, product_audit에 제약 조건을 넣는 것이 좋습니다? 삭제 된 항목을 잡는 테이블이 있습니까? –

+1

구현하고자하는 것은 '소프트 삭제'또는 이와 유사한 것입니다. 따라서 데이터베이스에서 항목을 삭제하고 싶지만 완전하지는 않은 경우 - 백업하고 싶습니다. 그런 경우 엔 그 항목들을 다른 테이블로 옮기지 않을 것이지만'product' 테이블에'deleted'라는 또 다른 컬럼을 생성 할 것입니다. 기본값은 0/false입니다. 'product'에서 한 행을 지우고 싶을 때마다, 삭제 된 것을 1/true로 설정하십시오. 'product'에서 선택할 때마다'WHERE deleted = 0'을 쿼리에 추가하십시오. 또한'product' 테이블에'WHERE' 문으로 뷰를 생성 할 수 있습니다. – wolfgangwalther

+0

예. 왜 다른 테이블에 넣으려고했는데 테이블이 커져서 성능에 영향을 미치지 않도록하는 것입니까? 나는 내가 말한 것에 대해 확신하지 못합니다. –

2

product 테이블에 delete을 입력하려는 항목이 다른 표에 parent입니다. 즉, 테이블에서 항목을 삭제하려고하면 product_id=1이 항목으로 순환하는 모든 항목을 먼저 삭제해야한다는 것을 의미합니다.

의 당신이 user

+--------+-------+--------+ 
| UserID | Name | Gender | 
+--------+-------+--------+ 
| 1  | Jason | Male | 
+--------+-------+--------+ 
| 2  | Sara | Female | 
+--------+-------+--------+ 
| 3  | John | Male | 
+--------+-------+--------+ 

라는 테이블이 있고 user_id이 외부 키 인 상태 user 테이블을 참조하는 테이블 user_address을 가정 해 봅시다. 이제이 같은 user에서 삭제 쿼리를 실행하려면

+-----------+-----------+--------+ 
| AddressID | Address | UserID | 
+-----------+-----------+--------+ 
| 1   | Address A | 1  | 
+-----------+-----------+--------+ 
| 2   | Address B | 1  | 
+-----------+-----------+--------+ 
| 3   | Address C | 2  | 
+-----------+-----------+--------+ 

:

당신은이 게임에있는이 Address A, 그것은 모든 아이들 (의존성)을 삭제했는지 확인해야
delete from user where userID=1; 

Address B.

+0

SELECT constraint_name, table_name FROM information_schema.table_constraints WHERE constraint_type = 'FOREIGN KEY' AND table_schema = DATABASE() AND constraint_name LIKE '%product_id%' ORDER BY constraint_name;' 
- 내가 말했듯 위. 당신이 진술 한 것과 똑같습니까? 다른 테이블의 부모님은 무엇을 의미합니까? 어떤 타 테이블에 외래 키가 있다는 뜻인가요? –

0

product_id이 다음 테이블에서 FOREIGN KEY으로 사용되는지 여부를 확인할 수 있습니다.

는 ** "이제, 내가 전에 다른 테이블 항목이 원활해야 삭제 내가 '제품'테이블을 삭제하고 항목을 사용하여 적이 한 것이 무엇인지 혼란.."**
관련 문제