source

mysql은 같은 now()로 여러 열을 업데이트합니다.

gigabyte 2022. 9. 16. 23:07
반응형

mysql은 같은 now()로 여러 열을 업데이트합니다.

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

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

2개의 콜이 표시되므로 안전하고 컬럼이 다른 시각으로 갱신될 가능성이 있습니다.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은 스테이트먼트가 실행을 시작할 때 스테이트먼트당 1회 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()는 2개의 쿼리를 실행할 수 있는 동일한 값을 가지고 있습니다(두 번째 질문에도 응답합니다.이 경우, 이 질문은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()1 쿼리당 1회만.

여기에는 2가지 방법이 있습니다.

먼저 now()를 변수로 선언한 후 sql 문에 삽입하는 것이 좋습니다.예를 들어,

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

언급URL : https://stackoverflow.com/questions/3802256/mysql-update-multiple-columns-with-same-now

반응형