0

通过 php 发送查询时,如何为具有复合键的表创建 Upsert 功能?

我有一个 order_items 表,其键既是订单号又是项目号。然后,我有一个指向商店的 api,它返回订单元素的 xml 文档(然后我将其解析为数组)。我想获取这个字符串并更新已经存在的字符串并插入不存在的字符串。由于可能有数百个订单(可能还有数千个订单项),我不想运行查询来检查每个订单项是否都存在该项目。

我认为 Merge 可能是答案,但我的数据不存在于表中(它是我要写入表的数组)。有没有办法将一串数据与现有表合并?例如,相当于:

$query = "IF a.order_id and a.item_id --already exist
update db.dbo.order_items
SET a.quantity = $qty, a.status = $status ....
ELSE
INSERT (order_id, item_id, quantity, status)
VALUES 
($order_id, $item_id, $qty, $status)";

run_query($query);

谢谢你的帮助。

4

1 回答 1

1

如果其他人遇到这样的问题,这是满足我所有要求的解决方案:

merge <table> WITH (HOLDLOCK) as target
USING (VALUES('00001111','385480486071',10, '10.00','3.00','0.00'))
AS source (order_id, item_code, item_quantity, item_price, shipping_price, discount)
ON target.order_id = source.order_id AND target.item_code = source.item_code
WHEN MATCHED THEN
update
SET
item_quantity = source.item_quantity, target.item_price = source.item_price, target.shipping_price = source.shipping_price, discount = source.discount
WHEN NOT MATCHED THEN
INSERT (order_id, item_code, item_quantity, item_price, shipping_price, discount)
values(source.order_id, source.item_code, source.item_quantity, source.item_price, source.shipping_price, source.discount);
于 2012-11-30T22:38:01.980 回答