[mysql] mysql은 동일한 now ()로 여러 열을 업데이트합니다.

2 개의 datetime 열을 업데이트해야하며 mysql 버전 4.1.20을 사용하여 정확히 동일해야합니다. 이 쿼리를 사용하고 있습니다.

mysql> update table set last_update=now(), last_monitor=now() where id=1;

안전하거나 now()? 에 대한 두 번의 가시적 호출로 인해 열이 다른 시간으로 업데이트 될 가능성이 있습니다 .
나는 그것이 다른 값으로 업데이트 될 수 있다고 생각하지 않습니다 (내부적으로 mysql은 now()행당 한 번만 호출한다고 생각 합니다).하지만 전문가는 아닙니다. 어떻게 생각하십니까?

업데이트 :
두 번째 질문이 여기 에서 추출 되었습니다 .



답변

해결책을 찾았습니다.

mysql> UPDATE table SET last_update=now(), last_monitor=last_update WHERE id=1;

나는 이것을 MySQL Docs에서 발견 했고 몇 가지 테스트 후에 작동합니다.

다음 명령문은 col2를 원래 col1 값이 아닌 현재 (업데이트 된) col1 값으로 설정합니다. 결과적으로 col1과 col2는 동일한 값을 갖습니다. 이 동작은 표준 SQL과 다릅니다.

업데이트 t1 SET col1 = col1 + 1, col2 = col1;


답변

Mysql은 그다지 영리하지 않습니다. 여러 업데이트 또는 삽입 쿼리에서 동일한 타임 스탬프를 사용하려면 변수를 선언해야합니다.

now()함수 를 사용할 때 시스템은 다른 쿼리에서 호출 할 때마다 현재 타임 스탬프를 호출합니다.


답변

MySQL은 문이 실행을 시작할 때 문당 한 번씩 now ()를 평가합니다. 따라서 문당 여러 개의 보이는 now () 호출을 갖는 것이 안전합니다.

select now(); select now(), sleep(10), now(); select now();
+---------------------+
| now()               |
+---------------------+
| 2018-11-05 16:54:00 |
+---------------------+
1 row in set (0.00 sec)

+---------------------+-----------+---------------------+
| now()               | sleep(10) | now()               |
+---------------------+-----------+---------------------+
| 2018-11-05 16:54:00 |         0 | 2018-11-05 16:54:00 |
+---------------------+-----------+---------------------+
1 row in set (10.00 sec)

+---------------------+
| now()               |
+---------------------+
| 2018-11-05 16:54:10 |
+---------------------+
1 row in set (0.00 sec)


답변

업데이트 쿼리를 실행하기 전에 변수에 now () 값을 저장 한 다음 해당 변수를 사용하여 필드 last_updatelast_monitor.

이렇게하면 now ()가 한 번만 실행되고 필요한 두 열에서 동일한 값이 업데이트됩니다.


답변

타임 스탬프 열의 기본값에 다음 코드를 넣을 수 있습니다
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP. 업데이트시 두 열이 동일한 값을 사용합니다.


답변

now()동일한 값이 있는지 확인해야하는 경우 두 개의 쿼리를 실행할 수 있습니다 (두 번째 질문에도 답할 수 있습니다.이 경우 요청 update last_monitor = to last_update하지만 last_update아직 업데이트되지 않았습니다)

다음과 같이 할 수 있습니다.

mysql> update table set last_update=now() where id=1;
mysql> update table set last_monitor = last_update where id=1;

어쨌든 mysql은 now()쿼리 당 한 번만 요청할만큼 영리하다고 생각 합니다.


답변

두 가지 방법이 있습니다.

먼저 , SQL 문에 삽입하기 전에 now ()를 변수로 선언하는 것이 좋습니다. 의 말을하자;

var x = now();
mysql> UPDATE table SET last_update=$x, last_monitor=$x WHERE id=1;

논리적으로 last_monitor에 대해 다른 입력을 원하면 다음과 같은 다른 변수를 추가합니다.

var y = time();
mysql> UPDATE table SET last_update=$x, last_monitor=$y WHERE id=1;

이렇게하면 mysql 문뿐만 아니라 프로젝트에서 사용하는 서버 측 스크립팅 언어 (예 : PHP)에서도 변수를 가능한 한 많이 사용할 수 있습니다. 이러한 동일한 변수를 응용 프로그램의 프런트 엔드 양식에 입력으로 삽입 할 수 있습니다. 그것은 프로젝트를 정적이지 않고 동적으로 만듭니다.

둘째로 now ()가 업데이트 시간을 나타내면 mysql을 사용하여 행의 속성을 타임 스탬프로 표시 할 수 있습니다. 행이 삽입되거나 업데이트 될 때마다 시간도 업데이트됩니다.