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_update
와 last_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을 사용하여 행의 속성을 타임 스탬프로 표시 할 수 있습니다. 행이 삽입되거나 업데이트 될 때마다 시간도 업데이트됩니다.