2017-05-04 3 views
0

내 게임에서 아이템이 저장되는 방법에 대해 사용되지 않는 일부 코드를 변경하려고합니다. 현재 방법은 모든 항목을 삭제 한 다음 모든 항목을 삽입 한 다음 장비 (항목의 하위 표)를 삽입하는 것입니다. 성능에 큰 영향을 주었고 INSERT를 INSERT ON DUPLICATE KEY UPDATE로 변경하면 성능에 큰 영향을 미치는지 궁금합니다.중복 키 업데이트시 삽입

그렇다면 후속 질문이 있습니다. 제 계획은 원래의 inventoryitemid으로 항목을로드하고 나중에 저장하기위한 키로 사용합니다.

INSERT INTO inventoryitems (inventoryitemid, itemid) VALUES (?, ?) ON DUPLICATE KEY UPDATE ... 

몇 가지 조건을 놓칠 수 :이 다음 문을 실행할 때

문제입니다. 내가 원하는 것은 MySQL이 INSERT에 디폴트 값 (자동 증가)이 없으면, 그렇지 않으면 UPDATE이다. 현재 INSERT에서 키가 생성되기 때문에 inventoryItemid가 0 인 새 항목이 생성됩니다.

TL; DR : I (새 항목 0 inventoryitemid으로 게임 내에서 생성되기 때문에) 미리 inventoryitemid없이 DUPLICATE KEY UPDATE ON 삽입하는 방법이 필요하다. 현재로서는 inventoryitemid가 미리 무엇인지 지정해야하며 해당 정보에 액세스 할 수 없습니다.

첫째 목표와 문제

  1. 봅니다 미리 inventoryitemid없이 데이터베이스에 존재하지 않는 새로운 항목을 삽입합니다.
  2. 항목이 다음 증가 된 db 값으로 데이터베이스에 삽입되지 않습니다.

두 번째 목표 (아무 문제 없음) 기존 인벤토리 데이터베이스에 항목을 삽입하려고

  1. 데이터베이스가 성공적으로 데이터베이스 (야호!)

항목을 업데이트 항목 ID 솔루션 시도 : 자동 증가를 트리거하려고 NULL을 사용하여 값 삽입

+0

INSERT 대신 REPLACE 같은 소리를 사용하면 문제가 해결됩니다 (https://dev.mysql.com/doc/refman/5.7/en/replace.html) – TadejP

+0

'itemid'는 (가) 고유합니까? –

+0

@TadejP'REPLACE'는'INSERT ON DUPLICATE KEY UPDATE'와 동일한 유일성 기준을 필요로합니다. – Barmar

답변

0

새 행을 검색하려면 inventoryitemid = NULL을 지정하십시오. 중복 키가 아니기 때문에 새 행이 만들어지고 inventoryitemid이 자동으로 증가합니다.

이렇게 새 항목을 삽입하면 LAST_INSERT_ID()을 사용하여 할당 된 inventoryitemid을 얻을 수 있습니다. 그런 다음 게임 코드로 보낼 수 있으므로 새 항목에이 ID가 있음을 알 수 있습니다. 그런 다음 NULL 대신에이 ID를 사용할 수 있습니다.

기존 행을 수정할 때 inventoryitemid 값을 지정하십시오. 그런 다음 ON DUPLICATE KEY UPDATE 코드가 새 행을 삽입하는 대신이를 대체합니다.

+0

그 부분은 작동합니다. 내가 염려하는 것은 새로운 아이템이 게임에서 생성되었을 때 그것의 inventoryitemid를 알지 못할 때이다. 그래서 질의에 정보를 추가하려고하면 Java가 새로운 inventoryitemid를 0으로 인스턴스화하기 때문에 무엇을 먹을지 모릅니다. 문제가 있습니다. 내가 원한 것은 그것이 새로운 것이라면 나는 그것을 삽입하기를 원한다. –

+0

새 아이템을 만들 때, 미래에 아이템을 업데이트 할 수 있도록'inventoryitemid'를 게임 코드로 보내야합니다. – Barmar

+0

이것은 꽤 비싸기 때문에 어떻게해야합니까? 아이템은 몬스터가 죽고 떨어 뜨렸을 때 게임 내부에서 생성됩니다. 플레이어가 아이템을 만날 때마다 저장하고 싶지 않기 때문에, 로그 아웃 할 때 등을 저장합니다.이 시간 동안 원래의 해결책은 업데이트를 걱정하지 않고 모든 것을 삭제 한 다음 다시 삽입하는 것이 었습니다. 그러나 업데이트하고 싶기 때문에 inventoryitemid를 가져 오지만 이는 데이터베이스에 새 항목을 삽입하고 키를 생성하는 방법이 필요하다는 것을 의미합니다. –

관련 문제