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


87

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

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

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

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


1
여기에서 두 번째 질문을 제거하고 결국 별도의 게시물에 다시 게시하는 것이 좋습니다.
Cœur

답변:


144

해결책을 찾았습니다.

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;


이것이 작동하지 않을 방법이 있습니까? 프로 시저에서 또는 임시 테이블과의 조인을 사용합니까?
Soheil Rahsaz

7

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

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


5

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)

1

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

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


1

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


1
AFAIK "업데이트시"에는 테이블 당 하나의 열로 제한되므로 두 열 모두로 설정할 수 없습니다.
Radu Maris

0

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()쿼리 당 한 번만 요청할만큼 영리하다고 생각 합니다.


두 가지 업데이트는 어떻습니까? 당신은 또한 mysql이 하나의 문장으로 결합하기에 충분히 똑똑하다고 생각합니까? 그렇지 않기 때문에.
Rafael Herscovici 2014 년

0

두 가지 방법이 있습니다.

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


SO에 오신 것을 환영합니다. 이것은 문제에 대한 해결책이지만 "mysql 내장 NOW () 함수를 사용하는 데 문제가 있습니까?"라는 질문에 실제로 대답하지 않습니다. 또한 포스터가 제어 할 수없는 외부 언어를 사용하는 것이 좋습니다. 두 번째 제안은 확실하지 않지만 (mysql에 대한 기억은 그다지 상세하지 않습니다) 일부 문서 / 예제에 대한 링크로 지원하면 훨씬 더 신뢰할 수 있습니다.
Martin

두 번째 제안에서, 업데이트가 발생할 때마다 now ()를 타임 스탬프로 사용하려면 다음 링크가 도움이 될 수 있습니다. alvinalexander.com/mysql/… 첫 번째 제안에서 mysql 테이블의 각 열은 독립적입니다. 따라서 데이터 입력 (위의 질문에서 하나의 변수 사용과 같은)은 독립적으로 수행됩니다. 그러나>, <, =,! = ,! <와 같은 연산자를 사용하여 서로 다른 열의 데이터를 비교하고 대조 할 수 있습니다. 이것은 단순히 다음과 같이 열에 데이터를 입력 할 수 없음을 의미합니다. mysql> 업데이트 테이블 세트 last_update = last_monitor = now () 여기서 id = 1;
Wahinya Brian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.