首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle -SELECT-插入锁定模式

Oracle -SELECT-插入锁定模式
EN

Stack Overflow用户
提问于 2013-09-17 16:23:00
回答 1查看 1.5K关注 0票数 3

我有一个表Orders (列为orderIdorderTypeuserIdstate、.)。我需要我的程序来做以下工作:

  1. 检查是否存在具有特定类型、特定用户的特定状态的订单(选择)。
  2. 如果这样的命令不存在-创建一个(插入)。

因此,基本上,我想保证,总只有一个订单:

  • orderType =x
  • userId =y
  • 状态=z

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

我必须说我对甲骨文没有经验。我在Oracle中读过锁上的这篇文章,这里唯一有用的锁类型是:

代码语言:javascript
复制
LOCK TABLE Orders IN EXCLUSIVE MODE

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

这种类型的并发有什么模式吗?甲骨文为选择更新模式创建了SELECT ... FOR UPDATE OF ...。SELECT-INSERT有类似的内容吗?

EN

回答 1

Stack Overflow用户

发布于 2013-09-17 17:07:32

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

代码语言:javascript
复制
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 );
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18854991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档