2012-11-20 5 views
7

나는 상점 ID와 플레이어의 ID 및 플레이어의 포인트가 포함 된 테이블을 가지고 있습니다. 내가하고 싶은 것은 가게에서 다른 곳으로 이전 지점입니다. 상점 ID와 플레이어 ID는 고유 한 색인을 형성합니다. 내가하고 싶은 일은 중복 키 업데이트에서 하나의 항목의 포인트를 다른 항목에 추가하고 "보낸 사람"항목을 삭제하는 대신 실패하게하는 것입니다. 같은 뭔가 :중복 키 업데이트에 대한 업데이트

UPDATE `playerspoints` 
SET `boardId`=$to 
WHERE `boardId`=$from 
ON DUPLICATE KEY UPDATE `points`=.... get the idea? 
+0

내 생각에 2 (ish) 쿼리와 if/else 블록을 사용하면이 방법이 더 간단해질 것입니다. 이런 식으로하고 싶은 특별한 이유가 있습니까? – landons

+2

언어의 장점을 최대한 활용하는 것이 좋습니다. 그것은 물건을 발견하고, 가능한 한 빨리 물건을 만드는 것에 관한 것입니다. –

+0

프로덕션 환경에 배포 된 경우 이것이 [적절한 SQL 회피] (http://bobby-tables.com/)가되기를 정말로 바랍니다. 그런 나체 변수를 보는 것은 걱정입니다. – tadman

답변

3

당신 만 ON DUPLICATE KEY 지역에 하나의 충돌 행의 맥락에서 변경을 할 수 있습니다. 또한, 이것은 내가 아는 한, INSERT 성명의 자산입니다.

필요한 것은 저울에서 더하기와 빼기를 기록한 후 간단한 수동 대장을 사용하여 수동으로 또는 트리거를 사용하여 표로 정리하는 것입니다.

INSERT INTO points_adjustments (boardId_from, boardId_to, points) 
    VALUES (?, ?, ?) 

이보다 쉽게 ​​항목의 쌍으로 표현 될 수 있습니다 :

예를 들어, 가장 간단한 방법은 당신은 + N 포인트에 대해 하나 개의 항목을 추가 할 것

INSERT INTO points_adjustments (boardId, points) 
    VALUES (?, ?) 

하고, -n에 대해 일치하는 것. 언제든지 SUM(points)을 사용하여 균형을 잡을 수 있습니다. 이 값을 VIEW으로 마무리하면 쉽게 검색 할 수 있습니다. 원한다면 합계를 트리거를 사용하여 다른 테이블의 열로 비정규화할 수도 있습니다.

간단한 트리거는 영향을받는 각 boardId에 대해 다음 문을 실행합니다 : 이것은 처음에 키 충돌을 방지하고 발생한 거래의 감사 기록을 제공

INSERT INTO balances (boardId, points) VALUES (?, ?) 
    ON DUPLICATE KEY SET points=points+VALUES(points) 

.

어쨌든이 모든 작업을 자동으로 수행하려면 아마도 트리거를 사용해야 할 것입니다.

+0

나는이 솔루션을 좋아하지만, 내가 그렇게 할 시간이 오기 전에는 트리거를 사용하지 않았다. 탈출과 관련하여 ...\t = (INT)는 mysql_real_escape_string ([ '에서'] $ _ 요청)로부터 $; \t \t \t \t $ to \t = (int) mysql_real_escape_string ($ _REQUEST [ 'to']); \t \t \t \t $ = $ 조건 [를는 mysql_real_escape_string ($ _ REQUEST [ '삭제'])] 삭제; \t \t \t \t $ 콘테스트 = $ 조건 [는 mysql_real_escape_string ($ _ 요청 [ '경쟁'])]; 내가 할 수있는 일이 더 많습니까? –

+0

예. 트리거는 논리적 인 다음 단계입니다. 제약 조건 위반에 대한 자동 삭제는 야심적인 생각이었습니다. – landons

+0

예 ... PDO (또는 다른 DB 추상화 라이브러리)를 사용하십시오. – landons

0

아니요. MySQL에서는 제약 조건 위반시 레코드를 삭제할 수 없습니다. 임박한 제약 조건 위반을 검사하는 before 업데이트 트리거를 수행 할 수 있지만, 5.1의 경우에도 동일한 테이블의 데이터를 수정할 수는 없습니다.이 경우에는 어쨌든 무한 루프가 발생할 수 있습니다.

Tadman의 답변 이전에 중간 정도만 완료되었습니다. 나는 개인적으로 그의 생각이 마음에 든다.

관련 문제