限制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的解决方案也很有用
答案 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应该只运行架构更改,这些更改已经过检查,因此在实践中不应该是一个问题