Oracle 约束具有三列,但只有一行可以等于某个值

2024-03-14

这听起来可能很简单,也可能很简单。我有 3 列,一列带有常量字符串(名称),一列(状态)带有两个选项(外键),另一列(room_id)是另一个表的父键,如何确保只设置一行相同名称的“ON”值。不能有多个具有相同名称的“ON”值的行,但可以有多个具有相同名称的“OFF”值的行。例子。

room_id       name       status
1             daniel       ON   --- OK for only one ON to be set for daniel
2             daniel       OFF
3             daniel       OFF
4             daniel       OFF
5             daniel       OFF
6             daniel       ON  --- THIS IS NOT ALLOWED...  but everything is UNIQUE
1             jeff         OFF
2             jeff         OFF
3             jeff         ON  --- OK for only ONE to be set to "ON" for jeff.
4             jeff         ON  --- THIS IS NOT ALLOWED... the room_id keeps things UNIQUE
5             jeff         ON  --- THIS IS NOT ALLOWED...

下面的 UNIQUE 约束允许多个具有相同名称的“ON”值。

ADD CONSTRAINT constratin_name_uq UNIQUE (room_id, name, status)

我相信我还需要一个 CHECK 约束,但状态列上的 COUNT 不大于 1,其中 value = 'ON'...以确保只有一个“NAME”和“STATUS”具有 ON 值... 。

下面的约束不允许有多个“OFF”值,这在我的例子中是需要的。

ADD CONSTRAINT constraint_name_uq UNIQUE (name, status)

另外...一切都可以“关闭”,但每个给定名称只能有一个“打开”。

任何帮助表示赞赏,

谢谢你, 丹尼尔


您可以创建唯一索引:

CREATE UNIQUE INDEX table_name__status_name__u
  ON table_name( CASE status WHEN 'ON' THEN name END );

其中,对于表:

CREATE TABLE table_name (
  room_id NUMBER
          NOT NULL,
  name    VARCHAR2(10)
          NOT NULL,
  status  VARCHAR2(3)
          NOT NULL
          CHECK ( STATUS IN ( 'ON', 'OFF' ) )
);

然后这有效:

INSERT INTO table_name ( room_id, name, status )
SELECT 1, 'alice', 'ON' FROM DUAL UNION ALL
SELECT 2, 'alice', 'OFF' FROM DUAL UNION ALL
SELECT 3, 'alice', 'OFF' FROM DUAL UNION ALL
SELECT 4, 'alice', 'OFF' FROM DUAL UNION ALL
SELECT 5, 'alice', 'OFF' FROM DUAL UNION ALL
SELECT 6, 'alice', 'OFF' FROM DUAL UNION ALL
SELECT 1, 'beatrice', 'OFF' FROM DUAL UNION ALL
SELECT 2, 'beatrice', 'OFF' FROM DUAL UNION ALL
SELECT 3, 'beatrice', 'OFF' FROM DUAL;

然而,这个:

INSERT INTO table_name ( room_id, name, status )
SELECT 7, 'alice', 'ON' FROM DUAL;

失败:

ORA-00001: unique constraint (FIDDLE_XFKAWDIVOXGJZVQESSZQ.TABLE_NAME__STATUS_NAME__U) violated

并且这也会失败并出现相同的异常:

INSERT INTO table_name ( room_id, name, status )
SELECT 4, 'beatrice', 'ON' FROM DUAL UNION ALL
SELECT 5, 'beatrice', 'ON' FROM DUAL;

数据库小提琴

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle 约束具有三列,但只有一行可以等于某个值 的相关文章

随机推荐

  • 你调用的对象是空的

    我使用以下代码来检查之前添加到复选框列表中的数据库表中的值 但在此处收到 对象引用未设置为对象的实例 错误 ListItem currentCheckBox chkbx Items FindByValue rdr MemberID ToSt
  • 如何使用 C# 隐藏/显示进程?

    在执行我的程序时 我想隐藏 最小化 Microsoft 语音识别应用程序 替代文本 http img143 imageshack us img143 9380 minimize png http img143 imageshack us i
  • 有没有办法同时使用布局宽度和高度的权重

    我有一个布局 其中有四个按钮沿着我的应用程序底部分布 使用布局权重将它们均匀分布 我还想使用相同的权重来增加按钮的高度 到目前为止 我所能看到的只是使用水平线性布局计算宽度或使用垂直线性布局计算高度 宽度效果很好 只是高度 如果重量不能同时
  • 通过右键单击任务栏可以防止 WinForms 中的死锁

    我的 Windows C NET 应用程序遇到了一个奇怪的问题 实际上它是一个GUI应用程序 我的工作是包含网络组件 封装在程序集中 我不知道主 GUI 应用程序的代码 不过我可以联系它的开发者 现在 应用程序的 UI 具有用于 启动 和
  • 如何将 java.io.File 转换为 java.lang.Class 来运行它?

    我有一个程序可以让用户选择任何 class or jar文件并运行它 问题是 要运行它 我需要使用除java io File 这是什么JFileChooser返回 我怎样才能做一个java io File into a java lang
  • 定义独立于数据库的 JPA 对象 uid

    事实证明 以下示例在使用 mysql 5 x 时有效 但在使用 oracle 10g 数据库时无效 有没有一种方法可以定义独立于数据库技术的唯一标识符字段 Id GeneratedValue strategy GenerationType
  • Java获取某个目录下所有文件的程序

    我正在开发这个程序来获取目录中的所有文件 由于某种原因 我在第 16 行收到 NullPointerException 但我不知道为什么 因为这是一个似乎在课堂上与我们的老师一起工作的模板 谢谢 import java util impor
  • MySQL 无法从现有表中进行选择,因为它不存在?

    我不知道发生了什么事 我有一张桌子叫project share invite 几个小时前 在我们的生产环境中 我无法再针对该表发出 SELECT MySQL 声称该表不存在 尽管它显示在show tables 今天机器上发生的唯一值得注意的
  • 搜索包含指定文本的 div

    我想在我的网站上创建一个搜索功能 在其中搜索 div 并忽略不符合我搜索内容的 div div 列表如下所示 div class subjects div soccer div div dancing div div soap div di
  • 如何以不同的风格或不同的构建类型使用不同的 proguard 文件?

    我需要为测试库制作不同的风格 为什么 好吧 我希望项目得到完全保护 所以我想始终启用缩小功能 即使对于调试构建类型 在进行测试时 我使用项目中的不同类 所以我决定使用flavor来更改proguard文件 它看起来像这样 android b
  • 使用 ASP.Net MVC 进行分页和排序网格

    想要改进这篇文章吗 提供此问题的详细答案 包括引用和解释为什么你的答案是正确的 不够详细的答案可能会被编辑或删除 我是 MVC 新手 并且不了解如何在网格上进行分页和排序 我习惯于使用 asp Net GridView 控件以及指向业务层中
  • Oracle SQL 一次选择中的非唯一表别名

    有人知道为什么这适用于两个表别名 x 吗 Select x company name x employee name FROM company x JOIN employee x ON x company id 5 我知道 id 5 的 J
  • 什么是 crossdomain.xml 文件?

    其实我希望我知道从哪里开始 我在我的个人网站中嵌入了第三方 SWF 图像库控件 SWF 是 XML 驱动的 我按如下方式动态加载 XML 文件 var flashvars xmlPath http www example com xml a
  • 如果双 SIM 卡槽之一的 SIM 卡发生更改,如何检索该卡的信息?

    我知道我们可以使用 TelephonyManager 类检索单张 Sim 卡的信息 但如何检索多张SIM卡的信息呢 假设我的手机丢失了 有人更换了其中一个插槽中的 SIM 卡 我如何接收 IMEI 号码 电话号码等信息 我只在更换 Sim
  • 无法将 [] 索引应用于“Array”类型的表达式

    对于下面的代码 我收到 无法将 索引应用于 数组 类型的表达式 目的是创建一个计算器模板 然后调用这些方法来运行各种操作 标记为 HERE 的区域出现错误 请帮忙 我是 C 编码的新手 因此 感谢所有帮助 如果有人也能向我解释这个问题 我希
  • Python 中的最大重量/最小成本二分匹配代码

    我正在寻找二分图中最大权重 最小成本匹配的Python代码 我一直在 NetworkX 中使用一般情况最大权重匹配代码 但发现它对于我的需求来说太慢了 这可能是因为通用算法速度较慢 而且 NetworkX 解决方案完全用 Python 实现
  • 使用 Heroku 部署 Flask

    我正在尝试将 Flask 应用程序部署到 Heroku 但是在推送代码时出现错误 2013 06 23T11 23 59 264600 00 00 heroku web 1 Error R10 Boot timeout gt Web pro
  • 如何使用vibed将文件加载到本地文件系统?

    我需要将数据从网络浏览器发送到本地文件系统 为了发送数据 我使用 Vue JS成分 https github com james2doyle vue file upload component
  • 从嵌入式 ZIP 存档中读取文件

    我有一个嵌入到较大文件中的 ZIP 存档 我知道存档在较大文件中的起始偏移量及其长度 是否有任何 Java 库可以让我直接读取存档中包含的文件 我正在思考ZipFile getInputStream http docs oracle com
  • Oracle 约束具有三列,但只有一行可以等于某个值

    这听起来可能很简单 也可能很简单 我有 3 列 一列带有常量字符串 名称 一列 状态 带有两个选项 外键 另一列 room id 是另一个表的父键 如何确保只设置一行相同名称的 ON 值 不能有多个具有相同名称的 ON 值的行 但可以有多个