INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE    
name="A", age=19

위에 쿼리문은 값은 INSERT 하는데, 대신 ID 값이 이미 존재하면 INSERT가 아닌 UPDATE를 실행하는 구문입니다.

xe 상의 XML로 구현할려니까 감이 안잡히는데요. 어떤식으로 작성해야 되나요?

  • profile

    XE에서 쓰는 XML 문법은 여러 DB에서 공통으로 지원하는 최소한의 기능만 보장하는데,

    ON DUPLICATE KEY UPDATE는 MySQL에서만 지원하는 비표준 기능이라서 지원하지 않습니다.

     

    UPDATE를 먼저 해보고 affected rows가 없으면 INSERT를 하는 방법도 있고

    (라이믹스에서는 DB::getInstance()->getAffectedRows() 사용 가능... XE에는 함수 없음)

    INSERT를 먼저 해보고 에러가 나면 UPDATE를 하는 방법도 있습니다.

     

    성능이나 안정성 면에서는... UPDATE가 더 잦을 것으로 예상된다면 전자가 유리하고

    INSERT가 더 잦을 것으로 예상된다면 후자가 유리합니다.

  • profile ?
    오 역시.. 감사합니당
  • ? profile

    참고로 id당 하나씩만 존재해야 하는 설정값을 신규 생성 또는 업데이트할 때
    XE 코어와 서드파티 자료에서 흔히 사용하는 방법은 아래와 같습니다.

    1. BEGIN TRANSACTION
    2. 중복 가능성이 있는 레코드 모두 DELETE
    3. 새 레코드 INSERT
    4. COMMIT

    UPDATE는 아예 사용하지 않는 거죠.

    XE에는 get affected rows 기능이 없어서 이렇게 구현한 것인지도 모르지만,

    아무튼 호환성은 이쪽이 더 나을 것 같습니다.