我的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功能吗?
解决方法
这两个约束会做:
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).
在组合中,两个几乎相反的约束将行数限制为零或一.
在虚构的DBMS(当前没有sql实现允许这种构造)允许由0列组成的主键上,这也是一个解决方案:
CREATE TABLE dbo.Configuration ( -- no ConfigurationID needed at all -- the rest of the columns CONSTRAINT Configuration_PK PRIMARY KEY () -- 0 columns! ) ;