一尘不染

如何将表中的最大行数限制为 1

sql-server

我的 SQL Server 数据库中有一个配置表,该表应该只有一行。为了帮助未来的开发人员理解这一点,我想防止添加多行数据。我选择为此使用触发器,如下所示…

ALTER TRIGGER OnlyOneConfigRow
    ON [dbo].[Configuration]
    INSTEAD OF INSERT
AS
BEGIN
    DECLARE @HasZeroRows BIT;
    SELECT  @HasZeroRows = CASE
        WHEN COUNT (Id) = 0 THEN 1
        ELSE 0
    END
    FROM
        [dbo].[Configuration];

    IF EXISTS(SELECT [Id] FROM inserted) AND @HasZeroRows = 0
    BEGIN
        RAISERROR ('You should not add more than one row into the config table. ', 16, 1)    
    END
END

这不会引发错误,但不允许第一行进入。

还有比这更有效/更自我解释的方法来限制可以插入到表中的行数仅为 1?我是否缺少任何内置的 SQL Server 功能?


阅读 154

收藏
2022-11-13

共1个答案

一尘不染

这两个约束会做:

CREATE TABLE dbo.Configuration
( ConfigurationID TINYINT NOT NULL DEFAULT 1,
  -- the rest of the columns
  CONSTRAINT Configuration_PK 
    PRIMARY KEY (ConfigurationID),
  CONSTRAINT Configuration_OnlyOneRow 
    CHECK (ConfigurationID = 1)
) ;

您需要两个PRIMARY KEY(或一个UNIQUE约束),因此没有两行具有相同的ID值,并且CHECK约束使所有行都具有相同的ID值(任意选择为1)。
结合起来,这两个几乎相反的约束将行数限制为 0 或 1。


在允许由 0 列组成的主键的虚构 DBMS(当前没有 SQL 实现允许这种构造)上,这也是一个解决方案:

CREATE TABLE dbo.Configuration
( -- no ConfigurationID needed at all
  -- the rest of the columns
  CONSTRAINT Configuration_PK 
    PRIMARY KEY ()                -- 0 columns!
) ;
2022-11-13