数据库设计 - 已标记字段
问题描述:
我具有属性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的
答
我会创建一个新表。我建议你不要把它称为PRIMARY,因为这是一个保留字。您还应该包含约束以确保它不会有多行。例如:
CREATE TABLE prm
(id INTEGER NOT NULL REFERENCES TableA (id),
IsPrimary BIT NOT NULL
DEFAULT (1)
CHECK (IsPrimary=1) UNIQUE);
答
您可以使用 “检查”
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
在我看来,第一种解决方案(表格Primary)对于简单性和执行效率以及编程简单性都更好。 – Renzo