将表限制为只有一行

时间:2010-05-18 11:49:15

标签: sql sql-server

限制SQL表以允许它只有一行的最简洁方法是什么?

This related question讨论了为什么存在这样的表,而不是如何实现约束。

到目前为止,我只发现涉及一个唯一键列的黑客,该列被限制为具有特定值,例如: ALWAYS_0 TINYINT NOT NULL PRIMARY KEY DEFAULT (0) CONSTRAINT CHECK_ALWAYS_0 CHECK (ALWAYS_0 = 0)。我猜这可能是一种更清洁的方法。

理想的解决方案是可移植SQL,但特定于MS SQL Server或postgres的解决方案也很有用

3 个答案:

答案 0 :(得分:4)

最干净的方式(我认为)将是一个引发异常的ON INSERT触发器(从而阻止插入行)。这也为客户端应用程序提供了优雅恢复的机会。

答案 1 :(得分:2)

我刚刚在SQL Server 2008上解决了同样的问题,方法是创建一个带有计算列的表并将主键放在该列上:

CREATE TABLE MyOneRowTable (
    [id] AS (1) PERSISTED NOT NULL CONSTRAINT pk_MyOneRowTable PRIMARY KEY,
    -- rest of the columns go here
);

答案 2 :(得分:1)

使用Grant删除任何人在添加一行后插入表格的权限

您的dba将能够插入,但dba应该只运行架构更改,这些更改已经过检查,因此在实践中不应该是一个问题