2012-11-03 5 views
3

StackOverflow를 검색했지만 특정 질문에 대한 답변을 찾을 수 없습니다.중복 키 업데이트로 인한 외래 키 제약 조건 오류

최근에 나는 "INSERT INTO ... ON DUPLICATE KEY UPDATE"를 사용하여 목록으로 레코드를 업데이트하는 것을 크게 좋아했습니다. 오류의 결과

INSERT INTO itens (prod_id, qtd) VALUES (410, 1),(442, -1) 
ON DUPLICATE KEY UPDATE qtd = qtd + VALUES(qtd) 

: 그러나, 나는 다음 쿼리에 문제가 있었다 "추가 또는 자식 행을 업데이트 할 수 없습니다가 :. 외래 키 제약 조건이 실패"

다음은 해당 테이블의 구조입니다. "carrinho_id"는 외래 키입니다. 나는 외래 키를 가지고 무엇인가를하려하지 않고 있다는 사실에 의아해했다. 간단히 수량을 업데이트하고 싶었습니다.

CREATE TABLE IF NOT EXISTS `itens` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`carrinho_id` int(10) unsigned NOT NULL DEFAULT '1', 
`prod_id` int(10) unsigned NOT NULL DEFAULT '1', 
`qtd` int(12) NOT NULL DEFAULT '0', 
PRIMARY KEY (`id`), 
KEY `carrinho_id` (`carrinho_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=229 ; 

답변

5

나는 내 자신의 문제에 대한 답을 찾았으며 유사한 상황에서 다른 사람들을 도울 것이라고 생각했습니다.

문제는 삽입을 사용하여 업데이트하려고하면 삽입의 모든 제약 조건을 고려해야한다는 것입니다. 정의되지 않은 값은 기본값을 가져야합니다. 나는 'carrinho_id'에 대한 기본값을 가졌지 만, 이미 삭제 된 레코드 였기 때문에 오류가 발생했습니다.

그것은 내 유일한 문제가 아닙니다. MySql이 중복을 탐지하려면 유일해야만하는 행을 지정해야합니다. 나는 'id'를 생략했기 때문에 단순히 새로운 행을 추가하여 수량의 값을 0에서 빼 냈습니다. 열이 부호가없는 경우에만 그런 식으로 수량을 뺄 수 있다는 것도 중요합니다. (기본 및 외래) 모든 키는 나를 위해 속임수를 썼는지 지정

INSERT INTO itens (id, carrinho_id, prod_id, qtd) VALUES (225, 75, 410, 1),(226, 75, 442, -1) 
ON DUPLICATE KEY UPDATE qtd = qtd + VALUES(qtd) 
+0

: 결국

, 나는 기본 키와 외래 키 모두를 지정하여 성공했다. 감사! –