假设您的组织中有分支机构的表格。其中一些是“主要”分支机构,另一些则是分支机构分支机构。除了这种仅影响系统中几件事情的区别之外,分支都是同伴并具有相同的属性(地址等)。模型的一种方式是像一个表:如何在SQL表中最好地实施单级递归?
CREATE TABLE Branch (
branch_id INT NOT NULL PRIMARY KEY IDENTITY(1,1),
branch_name VARCHAR(80) NOT NULL,
street VARCHAR(80) NULL,
city VARCHAR(30) NULL,
state CHAR(2) NULL,
zip CHAR(5) NULL,
is_satellite_office BIT NOT NULL DEFAULT(0),
satellite_to_branch_id INT NULL REFERENCES Branch(branch_id)
)
其中is_satellite_office
= 1当且仅当该记录是一个卫星到另一个分支,satellite_to_branch_id
是指你是哪个部门的卫星,如果有的话。
这是很容易把约束放在桌子上,使那些两列在任何给定的记录一致认为:
CONSTRAINT [CK_Branch] CHECK
(
(is_satellite_office = 0 AND satellite_to_branch_id IS NULL)
OR (is_satellite_office = 1 AND satellite_to_branch_id IS NOT NULL)
)
不过,我真正想要的是一种方法来保证这个递归唯一无二一个级别...也就是说,如果我指向一个分支作为我的父级,它不能有父级本身,并且它的值为is_satellite_office
必须为0.换句话说,我并不真的需要一个完全递归树结构,我只是想限制它到一个单一的父母/子女关系。这就是我要写代码的方式,如果有一种方法可以在数据库中强制执行,而不会像完全废话一样执行,我想。
任何想法?我正在开发MSSQL 2005,但一般(非供应商特定的)解决方案是首选。除非确实没有其他方法可以实现,否则不需要触发器。
编辑:要清楚,satellite_to_branch_id
是递归指针指向同一分支表中的另一条记录。我知道我可以删除is_satellite_office BIT
并依靠IsNull(satellite_to_branch_id)
给我提供相同的信息,但我发现它更清晰一点,除此之外,这不是问题的要点。我真的想找一个纯粹的SQL约束的方式来防止大于1
+1。那种我害怕的东西,但我希望有人有一个很酷的伎俩来做到这一点。 – 2009-01-08 16:36:21
我会好奇的看看是否有人提出纯粹的数据定义约束,如果解决方案存在水,我会删除我的答案。 – 2009-01-08 16:39:09