我昨晚问了这个,并获得了合并的信息(在postgresql中不可用)。我愿意尝试the workaround suggested但我只是想了解为什么不能用条件逻辑来完成。
我已经澄清了一些问题,所以也许这会更容易理解。
我有一个将数据插入表中的查询。但它每次都创造了新纪录。有没有办法可以检查行是否在那里,如果是,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逻辑来完成这项任务。
答案 0 :(得分:2)
您会对此问题和答案感兴趣:Insert, on duplicate update in PostgreSQL?
基本上,要么使用两个查询(执行select,如果找到更新,否则插入),这不是最好的解决方案(两个同时运行的脚本可能会给出重复的插入),或者按照上面的问题建议 - 做一个存储过程/函数(这可能是最好的选择,也是最容易的)。
答案 1 :(得分:1)
认识到工作流程的性质,似乎订单无法在开始之前或同时停止,对吧?它必须已经开始以便停止,对吧?如果我错了,请纠正我。
因此,您可以检查它是否为启动操作,并在这种情况下执行INSERT
,或停止操作并执行UPDATE
。
我觉得并发在这里并没有真正发挥作用。