如何在表上设置约束,以便只有一个记录的isDefault
位字段设置为1?
约束不是表范围,而是由FormID指定的每组行的一个默认值.
在SQL Server 2008或更高版本上,您只需使用唯一的筛选索引即可
CREATE UNIQUE INDEX IX_TableName_FormID_isDefault ON TableName(FormID) WHERE isDefault = 1
表是哪里的
CREATE TABLE TableName( FormID INT NOT NULL, isDefault BIT NOT NULL )
例如,如果您尝试插入多个具有相同FormId且isDefault设置为1的行,则会出现此错误:
无法在对象'dbo.TableName'中插入具有唯一索引'IX_TableName_FormID_isDefault'的重复键行.重复键值为(1).
资料来源:http://technet.microsoft.com/en-us/library/cc280372.aspx
这是Damien_The_Unbeliever解决方案的修改,允许每个FormID一个默认值.
CREATE VIEW form_defaults AS SELECT FormID FROM whatever WHERE isDefault = 1 GO CREATE UNIQUE CLUSTERED INDEX ix_form_defaults on form_defaults (FormID) GO
但是严肃的关系人会告诉你这些信息应该只在另一张表中.
CREATE TABLE form FormID int NOT NULL PRIMARY KEY DefaultWhateverID int FOREIGN KEY REFERENCES Whatever(ID)
从标准化的角度来看,这将是存储单个事实的低效方式.
我会选择通过将(在不同的表中)外键存储到被认为是默认行的行的标识符(更高级别)来保存此信息.
CREATE TABLE [dbo].[Foo]( [Id] [int] NOT NULL, CONSTRAINT [PK_Foo] PRIMARY KEY CLUSTERED ( [Id] ASC ) ON [PRIMARY] ) ON [PRIMARY] GO CREATE TABLE [dbo].[DefaultSettings]( [DefaultFoo] [int] NULL ) ON [PRIMARY] GO ALTER TABLE [dbo].[DefaultSettings] WITH CHECK ADD CONSTRAINT [FK_DefaultSettings_Foo] FOREIGN KEY([DefaultFoo]) REFERENCES [dbo].[Foo] ([Id]) GO ALTER TABLE [dbo].[DefaultSettings] CHECK CONSTRAINT [FK_DefaultSettings_Foo] GO