我正在寻找一种将应用程序配置表限制为 1 行的简单方法。我知道我可以使用包含子查询的虚拟列或顶部的物化视图来做到这一点,但实际上它是一个简单的表,我想要一个不需要更多行来实现而不是创建表的约束。
我想到的最简单的方法是将 ID 字段设置为 1,以及 ID 必须为 1 的检查约束 - 但这会在表中添加一个令人困惑的额外字段,所以我希望有一些明显的我遗漏的东西,就像一个检查约束,其中 UNIQUE_FIELD = MAX(UNIQUE_FIELD),这是不允许的。
我正在寻找一种将应用程序配置表限制为 1 行的简单方法。我知道我可以使用包含子查询的虚拟列或顶部的物化视图来做到这一点,但实际上它是一个简单的表,我想要一个不需要更多行来实现而不是创建表的约束。
我想到的最简单的方法是将 ID 字段设置为 1,以及 ID 必须为 1 的检查约束 - 但这会在表中添加一个令人困惑的额外字段,所以我希望有一些明显的我遗漏的东西,就像一个检查约束,其中 UNIQUE_FIELD = MAX(UNIQUE_FIELD),这是不允许的。
Simplest 是基于函数的唯一索引
> create unique index table_uk on one_row_table ('1');
备择方案:
而不是一个表,你可以有一个 DUAL 视图这实际上意味着任何 UPDATE 实际上都是一个 CREATE OR REPLACE VIEW,这可能是不合适的。从包体或全局应用程序上下文返回值的函数可能是一种解决方法,如果它导致失效问题。
对于 11g,READ ONLY 表(或者,在早期版本中,只读表空间中的表)是一个选项。
以下是一些选项:
SELECT 1024 as buffer_size, '/var/tmp' as temp_dir, 'other constant' as other_constant from dual
。这不是一个可靠的解决方案。CREATE TABLE Singleton
(x INTEGER NOT NULL UNIQUE CHECK (x = 1),
col1 INTEGER NOT NULL);
(未经测试)
SQL 没有简洁的语法来将空属性集指定为键,这是一种耻辱,因为它会消除对多余的额外列的需要。这里的有效键实际上是空集,这就是为什么我使用 UNIQUE 约束而不是 PRIMARY KEY 作为对 x 的约束的原因。