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.startproduction_order_process_log.stop)。因此,在生成带有签出时间戳的记录之前,查询应该检查是否$production_order_process_id已经存在。如果它确实存在,那么时间戳可以进入stop并且$check_type可以是stop_user。否则,他们可以留下startstart_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 中重复更新时插入?

基本上,要么使用两个查询(进行选择,如果找到更新,否则插入),这不是最好的解决方案(同时运行的两个脚本可能会给出重复的插入),或者按照上述问题的建议做 - 制作一个存储过程/功能来做到这一点(这可能是最好的选择,也是最简单的)。

于 2012-07-19T23:27:39.453 回答
1

认识到您的工作流程的性质,订单似乎不能在开始之前或同时停止,对吧?它必须已经开始才能停止,对吧?如果我错了,请纠正我。

因此,您可以检查它是否是启动操作并INSERT在这种情况下执行操作,或者停止操作并执行操作UPDATE

我觉得并发在这里并没有真正发挥作用。

于 2012-07-20T00:57:03.410 回答