将Oracle表限制为单行的简单约束

orb*_*ish 9 sql oracle database-design referential-integrity oracle11g

我正在寻找一种将应用程序配置表限制为1行的简单方法.我知道我可以使用包含子查询的虚拟列或顶部的物化视图来执行此操作,但实际上它是一个简单的表我想要一个约束,它不需要更多的行来实现而不是创建表.

我想到的最简单的方法是将ID字段设置为1,并且检查约束ID必须为1 - 但这会给表添加一个令人困惑的额外字段,所以我希望有一些显而易见的东西我缺少,像一个检查约束,其中UNIQUE_FIELD = MAX(UNIQUE_FIELD),这是不允许的.

Gar*_*ers 14

最简单的是常量上基于函数的唯一索引

> create unique index table_uk on one_row_table ('1');
Run Code Online (Sandbox Code Playgroud)

备择方案:

而不是一个表,你可以有一个DUAL视图,这实际上意味着任何UPDATE实际上是一个可能不合适的创建或替换视图.从包体或全局应用程序上下文返回值的函数可能是一种解决方法,如果它导致失效问题.

使用11g READ ONLY表(或者,在早期版本中,只读表空间中的表)是一个选项.


Ron*_*nis 6

以下是一些选项:

  • 撤消该表的INSERT权限.
  • 通过过程管理对配置表的所有访问
  • 将配置表替换为隐藏具有检查约束(col = 1)和唯一约束的列的视图.
  • 无论如何,创建物化视图
  • 创建一个表触发引发异常的INSERT上的触发器
  • 重新思考表结构并添加FROM_DATE,以便不更新表,但每次都创建一个新行.您当前的配置将是具有最高from_date的行.该表的current_config视图很有用.
  • 将表替换为定义为的视图SELECT 1024 as buffer_size, '/var/tmp' as temp_dir, 'other constant' as other_constant from dual.这不是一个可靠的解决方案.