3

我有一张桌子Orders(有列orderId, orderType, userId, state, ...)。我需要我的流程来执行以下操作:

  1. 检查是否存在特定类型的订单,特定用户的特定状态(SELECT)。
  2. 如果这样的订单不存在 - 创建一个(插入)。

所以基本上我想保证总是只有一个订单:

  • 订单类型 = x
  • 用户 ID = y
  • 状态 = z

但是我不能创建约束,因为 x1、y1、z1 可以存在多个订单。

我必须说我在 Oracle 方面没有经验。我已经阅读了有关 Oracle 中锁的这篇文章,它表明唯一有用的锁类型是:

LOCK TABLE Orders IN EXCLUSIVE MODE

但我认为只为某些数据子集锁定整个表是过分的。我尝试SELECT ... FOR UPDATE OF <update_column>使用不同的列,<update_column>但它们允许我插入新行。

这种并发有什么模式吗?它是 OracleSELECT ... FOR UPDATE OF ...为 SELECT-UPDATE 模式创建的接缝。SELECT-INSERT 有什么类似的吗?

4

1 回答 1

6

您可以创建一个唯一的基于函数的索引来强制执行这种约束。如果您想强制有一个state具有“完成”的唯一行,但允许许多具有state“草稿”的行。

CREATE UNIQUE INDEX idx_index_name
    ON( CASE WHEN state = 'Done' THEN orderType ELSE NULL END,
        CASE WHEN state = 'Done' THEN userId ELSE NULL END,
        CASE WHEN state = 'Done' THEN state ELSE NULL END );
于 2013-09-17T17:07:32.487 回答