2

私は昨夜これを聞いて、マージに関する情報を入手しました(これはpostgresqlでは利用できません)。提案された回避策を試してみますが、条件付きロジックでは実行できない理由を理解しようとしています。

質問を少し明確にしたので、おそらくこれは理解しやすいでしょう。

テーブルにデータを挿入するクエリがあります。しかし、それは毎回新しい記録を作成しています。行が最初にあるかどうか、次にあるかどうか、UPDATEないかどうかを確認する方法はありINSERTますか?

$user = 'username';
$timestamp = date('Y-m-d G:i:s.u');
$check_time = "start"; //can also be stop
$check_type = "start_user"; //can also be stop_user

$insert_query = "INSERT INTO production_order_process_log (
   production_order_id, production_order_process_id, $check_time, $check_type)
VALUES (
 '$production_order_id', '$production_order_process_id', '$timestamp', '$user')";

テーブルはチェックインとチェックアウトの値(production_order_process_log.startおよびproduction_order_process_log.stop)を記録するという考え方です。$production_order_process_idしたがって、チェックアウトタイムスタンプのあるレコードが作成される前に、クエリはすでに存在するかどうかを確認する必要があります。存在する場合は、タイムスタンプを入力stopでき$check_typeますstop_user。そうでなければ、彼らはとどまることができstartますstart_user

私は基本的にこの結果を避けようとしています。

+----+---------------------+--------------------------------+--------------------+-------------------+-------------+-------------+
| id | production_order_id |   production_order_process_id  |        start       |        stop       | start_user  |  stop_user  |
+----+---------------------+--------------------------------+--------------------+-------------------+-------------+-------------+
| 8  | 2343                |   1000                         |  12 july 03:23:23  | NULL              | tlh         |  NULL       |
+----+---------------------+--------------------------------+--------------------+-------------------+-------------+-------------+
| 9  | 2343                |   1000                         | NULL               | 12 july 03:45:00  | NULL        |  tlh        |
+----+---------------------+--------------------------------+--------------------+-------------------+-------------+-------------+

このタスクを実行するためにpostgresqlロジックを検討するのを手伝ってくれてありがとう。

4

2 に答える 2

2

この質問と回答はあなたの興味を引くでしょう:PostgreSQLでの重複更新時に挿入しますか?

基本的に、2つのクエリを使用するか(更新が見つかった場合は選択を実行し、そうでない場合は挿入)、これは最善の解決策ではありません(2つのスクリプトを同時に実行すると、挿入が重複する可能性があります)、または上記の質問が示唆するように実行します-ストアドプロシージャを作成します/それを行うための関数(これはおそらく最良のオプションであり、最も簡単です)。

于 2012-07-19T23:27:39.453 に答える
1

ワークフローの性質を認識すると、注文は開始前または開始と同時に停止できないようですよね?そして、それは停止するために開始しなければなりませんでしたね?私が間違っている場合は訂正してください。

したがって、それが開始操作であるかどうかを確認INSERTしてその場合に実行するか、操作を停止してを実行することができUPDATEます。

ここでは、並行性は実際には機能しないように感じます。

于 2012-07-20T00:57:03.410 に答える