그래서 내 문제는 :동일한 TRANSACTION에서 동일한 행을 INSERT하고 UPDATE 하시겠습니까? (MySQL)
나는 선택적인 이미지 업로드 필드가있는 기사 제출 양식이 있습니다.
는 사용자가 양식을 제출하면 - 대략 어떤 일이 발생이됩니다 :
if($this->view->form->isValid($_POST){
$db->beginTransaction();
try{
// save content of POST to Article table
if(!$this->_saveArticle($_POST)){
return;
}
// resize and save image using ID generated by previous condition
if(!$this->_saveImage($_FILES){
$db->rollback();
return;
}
// update record if image successfully generated
if(!$this->_updateArticle(){
$db->rollback();
}
$db->commit();
}
}catch (Exception $e){
$db->rollback()
}
모든 모델 대용 키
public function save($Model){
if(!is_null($Model->id_article){
$Mapper->insert($Model->getFields());
return;
}
$Mapper->update($Model->getFields(),$Model->getIdentity());
}
의 존재를 확인하여 "UPSERT"기능을 자동화 매퍼를 사용하여 저장됩니다
article 테이블에는 ID, 제목 및 URL의 고유 UNIQUE 인덱스가 있습니다. 또한, 삽입하기 전에 모델의 ID 필드에 추가되는 UID를 생성합니다 (자동 증가 대신).
실행하려고하면 첫 번째 기사가 table - 그러나 후속 호출 (근본적으로 다른 입력 사용)은 DUPLICATE KEY 오류를 트리거합니다. MySQL은 조건 1 (_saveArticle)에서 생성 된 ID를 반환하고 키가 이미 존재한다고 불평합니다 ...
Model 필드 (및 조건 상태 - 삽입 | 업데이트)를 버리고 예상대로 진행됩니다 (의사) :
inserting!
id = null
title = something
content = something
image = null
updating!
id = 1234123412341234
title = something
content = something else
image = 1234123412341234.jpg
이 행 데이터는 데이터베이스에 없습니다.
1 :
나는이 몇 가지 중 하나가 될 수있는 그림 나는 하나의 로그인에서 여러 사이트와 인터페이스하도록 허용 사용자 로그인에 보조 DB 어댑터를로드하고 있습니다 -이 혼동 될 수 있습니다 트랜잭션 어떻게 든2 : 그것은 (아마도 1에 의해 트리거) 젠드 트랜잭션 구현에 약간의 설명 버그
3의 : 내가를 교체해야 INSERT ...를 사용하여 save()를 호출하십시오. 중복 ON
4 :: 제출 프로세스를 재구성하거나 이전에 삽입 한 행의 UID에 종속되지 않는 이미지의 이름을 생성해야합니다.
아직도 사냥,하지만 난 다른 사람이 문제의이 종류가 발생했습니다 또는 솔루션최고의 SWK
+1, wtf는 upsert ??? – ajreal
@ajreal : upsert = if exists then update else –