0

データベースログを実行していて、毎日新しい行にログオンしています。したがって、Mysql クエリは、日 (日付 (一意のキー)) が既に存在するかどうかを確認し、存在する場合は、ログ行のすべてのログ可能な値を 1 ずつインクリメントしようとします。日付レコードがまだ表示されていない場合は、新しい行が作成されます。

私のSQLクエリは次のとおりです。

INSERT INTO `log` (`date`,`hits`,`stale`)
VALUES ('2012-03-06',1,1)   
ON DUPLICATE KEY
UPDATE `hits`=`hits`+1,`stale`=`stale`+1
WHERE `date`='2012-03-06';"

すべての列のデフォルト値は 0 であるため、このクエリが真夜中の直後に実行される場合、'stale' と 'hits' のみが 1 に設定されます。

私は望む!(うまくいきません)。

私は何が欠けていますか?'hits' = 'hits' +1'stale'='stale'+1 の間に、カンマ以外のどの区切り記号を使用すればよいですか?

4

4 に答える 4

1

WHERE 句を取り除くだけです。

INSERT INTO `log` (`date`,`hits`,`stale`)
VALUES ('2012-03-06',1,1)   
ON DUPLICATE KEY
UPDATE `hits`=`hits`+1,`stale`=`stale`+1;
于 2012-03-06T19:31:07.447 に答える
1

セパレーターは正しいですが、UPDATE は、ON DUPLICATE KEY をトリガーできる重複行を既に検出しているため、WHERE を使用して再度選択する必要はありません。

INSERT INTO `log` (`date`,`hits`,`stale`)
VALUES ('2012-03-06',1,1)   
ON DUPLICATE KEY
UPDATE `hits`=`hits`+1,`stale`=`stale`+1

ここでデモ。

于 2012-03-06T19:35:25.583 に答える
0

WHERE条項を持ってはいけません。ON DUPLICATE KEY UPDATE影響を受ける行を、既存のキーを持つ行に自動的に制限します。

それを削除すると、クエリが正常に機能するはずです。

于 2012-03-06T19:32:04.030 に答える
0

特定の式が true の場合にのみ更新を実行する場合は、次の 2 つのステートメントを使用して実行できます。

INSERT IGNORE INTO x VALUES (.....);
UPDATE x SET ..... WHERE .....;

INSERT重複するキーがある場合、警告なしで失敗します。

于 2012-03-06T22:00:18.520 に答える