2017-08-16 73 views
0

我具有属性A和因此与甲一个表:数据库设计 - 已标记字段

ID Name OtherFields isPrimary 
1 foo  stuff   1 
2 bar  stuff   0 
3 blah  stuff   0 
4 blahh stuff   0 

的值isPrimary列标记行作为主。只有一行可以是主要行,并且必须始终有一行作为主要行

在数据库级执行此操作的最佳方法是什么?

最好的方法是创建一个名为Primary的表,它具有一列,ID将是引用A.ID的外键。或者,使用上面概述的表结构,我知道我们可以强制使用唯一索引将不超过一行设置为1,但是我不确定如何强制执行,必须有不少于一行的集合如1

我使用MS SQL Server的

+0

在我看来,第一种解决方案(表格Primary)对于简单性和执行效率以及编程简单性都更好。 – Renzo

回答

0

我会创建一个新表。我建议你不要把它称为PRIMARY,因为这是一个保留字。您还应该包含约束以确保它不会有多行。例如:

CREATE TABLE prm 
    (id INTEGER NOT NULL REFERENCES TableA (id), 
    IsPrimary BIT NOT NULL 
    DEFAULT (1) 
    CHECK (IsPrimary=1) UNIQUE); 
0

您可以使用 “检查”

CHECK (IsValid(isPrimary) = 'True') 

和isValid()的喜欢...

CREATE FUNCTION IsValid(
    @Tmp VARCHAR(1) 
) 
RETURNS VARCHAR(5) 
AS 
BEGIN 
    IF EXISTS (SELECT * FROM Table WHERE isPrimary = 1) 
     return 'False' 
    return 'True' 
END 

因此,它不能插入新行,其值isPrimary为0,直到所有行的值isPrimary为0

+0

请注意。如果在单个更新中更新多行,此CHECK约束将无法按预期的方式工作。 – sqlvogel