mysqlは同じnow()で複数の列を更新します


87

2つの日時列を更新する必要があります。mysqlバージョン4.1.20を使用して、それらを完全に同じにする必要があります。私はこのクエリを使用しています:

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

now()?への2つの表示された呼び出しのため、安全であるか、列が異なる時間で更新される可能性があります。
異なる値で更新できるとは思いませんが(内部的にはmysqlがnow()行ごとに1回だけ呼び出すなど)、私は専門家ではありません。どう思いますか?

更新: 2番目の質問がここに抽出されました


1
ここから2番目の質問を削除し、最終的には別の投稿に再投稿することをお勧めします。
・クール

回答:


144

解決策を見つけました:

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

私はこれをMySQLDocsで見つけ、いくつかのテストの後、それは機能します:

次のステートメントは、col2を元のcol1値ではなく、現在の(更新された)col1値に設定します。その結果、col1とcol2の値は同じになります。この動作は、標準のSQLとは異なります。

UPDATE t1 SET col1 = col1 + 1、col2 = col1;


これが機能しない方法はありますか?手順で、または一時テーブルとの結合を使用していますか?
Soheil Rahsaz

7

Mysqlはあまり賢くありません。複数の更新クエリまたは挿入クエリで同じタイムスタンプを使用する場合は、変数を宣言する必要があります。

このnow()関数を使用すると、別のクエリで呼び出すたびに、システムが現在のタイムスタンプを呼び出します。


5

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)

1

更新クエリを実行する前に、now()の値を変数に格納し、その変数を使用してフィールドlast_updateとの両方を更新できますlast_monitor

これにより、now()が1回だけ実行され、必要な両方の列で同じ値が更新されるようになります。


1

タイムスタンプ列のデフォルト値に次のコードを配置できます。 CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPしたがって、更新時に2つの列は同じ値を取ります。


1
「更新時」のAFAIKには、テーブルごとに1列の制限があるため、両方の列に設定することはできません。
ラドゥマリス2012年

0

それがnow()同じ値であることを本当に確認する必要がある場合は、2つのクエリを実行できます(2番目の質問にも答えます。その場合はupdate last_monitor = to last_updatelast_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回だけ要求するのに十分賢いと思います。


2つのアップデートはどうですか?また、mysqlはそれらを1つのステートメントに組み合わせるのに十分賢いと思いますか?それがないので。
Rafael Herscovici 2014年

0

これには2つの方法があります。

まず、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()関数の使用に問題がありますか?」という質問には実際には答えていません。また、投稿者が制御できない可能性のある外部言語を使用することをお勧めします。私が確信していない2番目の提案(mysqlの私の記憶はそれほど詳細ではありません)が、いくつかのドキュメント/例へのリンクでそれをサポートすると、はるかに信頼性が高まります。
マーティン

私の2番目の提案では、更新が行われるたびにnow()をタイムスタンプとして使用する場合は、次のリンクが役立ちます。 alvinalexander.com/mysql/… 私の最初の提案では、mysqlテーブルの各列は独立しています。したがって、データ入力(上記の質問で1つの変数を使用するなど)は独立して行われます。ただし、>、<、=、!=、!<などの演算子を使用して、異なる列のデータを比較および対比することができます。これは単に、このように列にデータを入力できないことを意味します。mysql> update table set last_update = last_monitor = now()where id = 1;
Wahinya Brian 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.