【问题标题】:Constrain a table to have only one row将表格限制为只有一行
【发布时间】:2016-10-20 16:46:47
【问题描述】:

将 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 的解决方案也很有用

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    最干净的方法(我认为)是一个引发异常的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
    );
    

    【讨论】:

    • 很高兴为您提供帮助。您甚至可以将值设为注释,例如 [id] AS ('table_should_only_have_one_row')。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      • 2015-07-12
      • 2014-11-27
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      • 2017-01-01
      相关资源
      最近更新 更多