代码之家  ›  专栏  ›  技术社区  ›  finnw

将表约束为只有一行

  •  6
  • finnw  · 技术社区  · 14 年前

    约束一个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 回复  |  直到 8 年前
        1
  •  2
  •   SQB    8 年前

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

    CREATE TABLE MyOneRowTable (
        [id] AS (1) PERSISTED NOT NULL CONSTRAINT pk_MyOneRowTable PRIMARY KEY,
        -- rest of the columns go here
    );
    
        2
  •  4
  •   Donnie    14 年前

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

        3
  •  1
  •   mmmmmm    14 年前

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

    您的DBA将能够插入,但是DBA应该只运行被检查的模式更改,所以在实践中不应该是一个问题。