11

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

我想到的最简单的方法是将 ID 字段设置为 1,以及 ID 必须为 1 的检查约束 - 但这会在表中添加一个令人困惑的额外字段,所以我希望有一些明显的我遗漏的东西,就像一个检查约束,其中 UNIQUE_FIELD = MAX(UNIQUE_FIELD),这是不允许的。

4

3 回答 3

17

Simplest 是基于函数的唯一索引

> create unique index table_uk on one_row_table ('1');

备择方案:

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

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

于 2011-03-29T22:46:06.470 回答
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。这不是一个可靠的解决方案。
于 2011-03-29T20:10:41.490 回答
0
CREATE TABLE Singleton
(x INTEGER NOT NULL UNIQUE CHECK (x = 1),
 col1 INTEGER NOT NULL);

(未经测试)

SQL 没有简洁的语法来将空属性集指定为键,这是一种耻辱,因为它会消除对多余的额外列的需要。这里的有效键实际上是空集,这就是为什么我使用 UNIQUE 约束而不是 PRIMARY KEY 作为对 x 的约束的原因。

于 2011-03-30T08:15:38.427 回答