2009-07-15 7 views
0

mysql에서 "IF record EXISTS ELSE INSERT"를 구현하려고합니다. 특히 Doctrine ORM을 사용하여이를 수행하는 방법을 찾아야합니다."IF"로 mysql 문을 시작할 수 있습니까?

네이티브 MySql을 사용하는 한 가지 해결책은 "중복 키 업데이트"를 사용하는 것입니다. 불행히도 이것은 Doctrine에서 지원되지 않습니다.

다른 반 솔루션은 "REPLACE INTO"구문을 사용하는 것입니다. Doctrine은 이것을 지원하지만 REPLACE는 레코드를 갱신하지 않고 새로운 자동 증가 ID를 사용하여 레코드를 삭제하고 새 레코드를 작성합니다. 따라서 자동 증분 ID에 의존하면 나쁜 솔루션입니다 .

내가 조작하려고하는 테이블은 INNODB이므로 트랜잭션을 살펴 보았지만 동일한 규칙이 트랜잭션 내부에서 적용되는 것처럼 적용되는지 완전히 이해하지 못합니다.

IF (INSERT IGNORE INTO 테이블 critical_id = $ id) 트랜잭션 내부에서 ELSE (UPDATE 테이블 SET field = 'new_value')를 종료 할 수 있습니까?

그런 말을 할 수 없다면이 문제에 대한 해결책이 있습니까?

답변

1

중 하나 "DUPLICATE KEY UPDATE ON"을 만들 수있는 방법을 찾아 작업, 또는 두 개의 문을 사용하여 전환 : 첫 번째 업데이트 또는 필요에 넣은 다음, 기존의 행을 찾아 선택합니다.

위의 작업을 수행하는 저장된 proc를 빌드하는 것만 큼, 거의 유일한 옵션입니다.

+0

"중복 키 사용"방법을 찾았는데 이것이 가장 좋은 해결책이라고 생각합니다. 따라서이 대답을 받아 들일 것이지만, mysql 관련 용어가없는 트랜잭션 솔루션이 있는지 파악하려고합니다. fwiw, 제목에 제기 된 질문에 결코 대답하지 않았습니다. 대답은 IF로 SELECT, INSERT, UPDATE 문을 시작할 수 없다고 생각합니다. 다른 dbms에 존재하는 Recordcount라는 속성에 대해 들어 봤습니다. ' 나는 "내부 트랜잭션 카운터"인 mysql 동등 물을 찾고 있는데, 어떤 레코드가 수정되었는지 알려주고있다. 여전히 쳐다보다. – seans

1

"삽입 또는 업데이트"를 "업서 트"라고합니다. 당신이 google "upsert mysql"경우에 당신은 단지 몇몇 해결책이다는 것을 것을을 발견 할 것이다.

  1. 2 단계, 삽입, 다음 업데이트 및 "DUPLICATE KEY UPDATE ON"변화

그리고 아마도 몇 가지 더 있지만, 그 대부분이 변화되어 교체. 당신의 SQL은 다음과 같이 보일 것이다

사용하여 트랜잭션 :

UPDATE xxx SET (x1, x2) = (y1, y2) WHERE id = myid; 
    IF found THEN 
     RETURN; 
    END IF; 
    BEGIN 
     INSERT INTO xxx (x1, x2) VALUES (y1, y2); 
     RETURN; 
    EXCEPTION WHEN unique_violation THEN 
    --##Do nothing, or you can put this whole sql code 
    --##in a LOOP and it will loop over and try update again 
    END; 

이 코드는 내 PostgreSQL의 기능 중 하나에서 제거된다. 나는 InnoDB가 이것을 지원하지 않는다고 생각하지만, 틀릴 수도있다.

관련 문제