当前位置: 首页 > 知识库问答 >
问题:

如何在没有PL/SQL的Oracle中创建此约束

岳晟
2023-03-14

这是我的玩具装置。我有三张桌子。一张桌子是客人列表(姓、名,随便什么)、食物列表(豆类、糊类、米饭、蔬菜)和订单列表(客人id、食物id)。我感兴趣的是订单清单。我想对它进行以下条件的约束。

客人必须有3份订单。客人可以有一个空订单。每个客人的订单不能相同,除非该订单为空。

因此订单表将如下所示(使用字符串而不是fk ID):

steve, beans
steve, rice
steve, veggies
joey, rice
joey, beans
joey, <null>
sarah, rice
sarah, <null>
sarah, <null>
sam, <null>
sam, <null>
sam, <null>
create table order (
  guest_uid FK,
  food_uid FK,
  CONSTRAINT order_unique UNIQUE (guest_uid, food_uid)
)

如果唯一有效的答案是“使用PL/SQL或触发器”,我会确保将其标记为正确的答案。

共有1个答案

淳于博文
2023-03-14

您可以使用基于函数的索引来强制行之间的唯一性(注意,我将表称为guest_food,因为order是一个保留字

create unique index idx_order_unique
    on guest_food( case when food_uid is not null
                        then guest_uid
                        else null
                    end,
                   case when food_uid is not null
                        then food_uid
                        else null
                    end );

这将允许您对任何特定的guest_uid有尽可能多的nullfood_uid行,同时不允许重复的非null值。

guest_food表中每个guest必须有三行的要求不是您可以通过约束来强制执行的。您可能会创建一个物化视图,在提交时进行快速刷新,存储每个guest_uid的行数计数,并添加一个约束,如果该计数不是3,则会引发错误。但这通常是一个很不寻常的事情想要强制执行,所以它会倾向于让我怀疑数据模型有点偏离。

 类似资料:
  • 问题内容: 我需要一个脚本来创建表,或者如果它已经存在,则将其删除,并在重新创建表时将其删除。经过一些研究,我发现在pl / sql中不存在。所以我想出了这个脚本: 有没有适当的方法来实现此功能? 问题答案: 使用全局临时表似乎是一个更好的选择。但是,如果您坚持在运行时删除和重新添加表,则可以查询_TABLES视图之一(即USER_TABLES,DBA_TABLES,ALL_TABLES)以确定该

  • 问题内容: 这是我想阻止在服务器上运行的那种查询的示例: 该查询(或其他类似查询)可能通过Oracle JDBC瘦驱动程序访问了我的Oracle服务器。我愿意阻止该查询在JDBC配置级别,数据库服务器配置级别或通过架构内的用户权限运行。我希望用户能够继续运行正常的选择/插入/更新/删除查询。老实说,如果没有可用的PL / SQL类型命令,而只有标准SQL,我会很高兴。 更新 我还应该提到,我希望用

  • 我试图创建一个简单的表,但它给了我一个错误: 剧本: 我想不出这个问题,有人能帮忙吗?

  • 我试图在Db2中创建Oracle PL/SQL包,但遇到了错误。 当我运行上面的代码时,它会导致以下错误: Deploy[tnbdr]db2inst1.arithmetic Running db2inst1.arithmetic-Deploy for debug started。Create PL/SQL Package Specification返回SQLCODE:-104,SQLSTATE:4

  • 本文向大家介绍Oracle DBMS中的PL / SQL块,包括了Oracle DBMS中的PL / SQL块的使用技巧和注意事项,需要的朋友参考一下 PL / SQL是一种块结构语言,即PL./SQL的代码以块的形式编写。PL / SQL还包含Oracle数据库的健壮性,安全性和可移植性。 PL / SQL的每个块均包含以下子部分- 声明- 本节包含所有需要在程序之前声明的项目,例如变量,子程序

  • 我在论坛上看了一下,但目前还没有这个问题的答案。基本上,我试图在我的过程中创建一个视图,因为它比复杂的select语句更容易,因为它返回的'ORA-01422EXACTE fetch返回的行数超过了请求的行数',所以它似乎不起作用。我把该语句放在底部以供参考