1

나는 다음과 같은 동작이있는 쿼리를 만들려고와 MySQL의 문제 : 경우IF 문 및 TIMESTAMP

  • 가 새 행을 삽입을 :id = NULL 또는 id = :id 아직 존재하지 않는 행.
  • id = :id이 이미 존재하는 행이 있으면 기존 행을 업데이트하십시오. status <> :status
    • 현재 값 :
    • NOW() 경우에 activated의 값을 설정합니다. (일명, status의 값이 변경되는 경우)
    • :status = 'active'의 값입니다.

이 작업을 수행하기 위해, 나는 다음 준비된 문을 만들었습니다. (일명 status의 새로운 값은 'active' 될 것입니다) :

INSERT INTO test 
    (`id`, `title`, `status`, `activated`) 
VALUES 
    (:id, :title, :status, NULL) 
ON DUPLICATE KEY UPDATE 
    id = LAST_INSERT_ID(id), 
    status = VALUES(status), 
    activated = IF(status <> VALUES(status) AND VALUES(status) = 'active', 
       NOW(), activated); 

지금까지 내가 볼 수 있듯이,이 문은 필요한 논리를 정확하게 설명합니다. 그러나 activated의 값은 status의 값이 'active'으로 변경 되든 상관없이 항상 변경되지 않습니다.

내가 뭘 잘못하고 있다고 설명 할 수 있습니까? 그리고 (선호) 그것을 고치는 방법을 설명하십시오?

답변

1

문제 매우 유엔-SQL과 같은 당신이 그것을 비교하기 전에, 당신이 상태를 할당하고있다; 이메일에있는 링크는 나에게 그런 짓을 할 수있는 활성화 코드를 사용

status=VALUES(status),         -- assign so they're equal 
activated=IF(status <> VALUES(status) AND    -- compare, always equal 
     VALUES(status) = 'active', NOW(), activated); 

할당을 바꾸면 문제가 해결됩니다.

INSERT INTO test 
    (`id`, `title`, `status`, `activated`) 
VALUES 
    (:id, :title, :status, NULL) 
ON DUPLICATE KEY UPDATE 
    id=LAST_INSERT_ID(id), 
    activated=IF(status <> VALUES(status) AND 
       VALUES(status) = 'active', NOW(), activated), 
    status=VALUES(status); 

는, BTW 당신은 ​​실제로 업데이트에 id을 설정할 필요을 변경할 열을 할당해야합니다.

+0

이봐, 나는 생각하지 않았다! 나는 그것을 지금 시험해 볼 것이다 :) –

+1

Allright! 그것은 작동합니다! 요아킴 많이 고맙다! –

0

ON DUPLICATE KEY UPDATE 절에 ID (또는 키 열)를 지정하지 마십시오. 가입일

: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

예를 들어, 열 A가 UNIQUE 선언하고 값 1이 포함되어있는 경우, 다음 두 문장은 동일한 효과를 가지고 테이블에

INSERT (a를, b, c) 이중화 키 업데이트시 VALUES (1,2,3) c = c + 1;

UPDATE 테이블 SET c = c + 1 WHERE a = 1;

현재 가장 가능성이 데이터베이스에 삽입 된 마지막 행이 아닌 중복 키 행 변화가 무엇. LAST_INSERT_ID()에있는 문서를 읽으십시오 : http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

귀하의 질문을 되돌아 보면, 나는 정말로/완전히 귀하의 질문에 대답하지 않는다는 것을 알고 있습니다. 나는 부분적으로 유스 케이스가 무엇인지 이해하려고 노력 중이다. 코드를 통해 사용자를 생성하는 경우 사용자를 만드는 관리자 인 경우 계정을 활성으로 설정하고 활성화 된 열이 있으면 설정합니다. 웹 양식을 통해 계정을 만드는 사용자 인 경우 이메일에 링크를 사용할 때까지 대기중인 것으로 설정됩니다.

update user set status='active' activated=NOW() where code=:activation_code 
+0

사실 "id = LAST_INSERT_ID (id)"부분이 거기에 있으므로 업데이트 된 행의 ID를 검색 할 수 있습니다. (또한 mysql 문서에 설명되어 있습니다) –