Sql server 检查另一个表中的特定值作为约束
我有两张桌子如下 餐车Sql server 检查另一个表中的特定值作为约束,sql-server,Sql Server,我有两张桌子如下 餐车 Manufacturer Model ApprovalStatus Toyota SE Approved Toyota C-HR Testing Prius XLE Approved Hyundai NEXO Testing 桌子经销商 ParkingSpace Manufacturer Model F1 Toy
Manufacturer Model ApprovalStatus
Toyota SE Approved
Toyota C-HR Testing
Prius XLE Approved
Hyundai NEXO Testing
桌子经销商
ParkingSpace Manufacturer Model
F1 Toyota SE
F2 Toyota SE
F3 Toyota C-HR
... ... ...
我想添加一个约束,根据制造商和型号将数据添加到经销商表中。只有状态为“已批准”的制造商和型号才应添加到经销商表中。如果用户试图输入状态为“未批准”的现有型号和制造商,则不应允许他们输入
如何基于外键制造商和型号检查ApprovalStatus
值,并将其添加为约束条件。没有很好的方法。没有在附加条件下应用外键的概念。下面是我想到的三个选择
分开的桌子
实现这一特定目标最简单的方法可能就是创建两个表——一个表中有认可的汽车,另一个表中有其他汽车
ApprovedCars
的主键将是(制造商、型号)
,然后您只需为该表创建一个外键即可
尽管如此,这种方法仍然存在一些异常的可能性-例如制造商,型号在两个表中。而且,这将增加需要访问整套汽车的查询的复杂性
索引视图
您希望断言下面的查询始终不返回任何行
SELECT C.Manufacturer, C.Model
FROM Car C
JOIN Dealership D
ON C.Manufacturer = D.Manufacturer
AND C.Model = D.Model
WHERE ApprovalStatus IS NULL OR ApprovalStatus <> 'Approved'
选择C.制造商、C.型号
来自C车
加入经销商D
C.制造商=D.制造商
C.模型=D.模型
其中ApprovalStatus为NULL或ApprovalStatus为“已批准”
您可以创建一个包含两行的帮助器表,并交叉连接到该表上,以消除任何冲突,然后将整个批次放在一个索引视图中,并对其进行唯一约束()
超类型/子类型模式
我假设您在汽车上的现有主键是(制造商、型号)
您可以在(制造商、型号、ApprovalStatus)
上添加一个逻辑冗余的附加的唯一约束,然后将ApprovalStatus
添加到经销商
表中,该表带有一个检查约束,该约束必须等于“Approved”,并具有一个引用所有三列的外键。Hmm我明白了,如果不把桌子分开,就没有办法组织这个吗?非常感谢。我假设这是我可以用check和join的组合来完成的。我想我会采纳你之前的建议,将它们分开并保持简单明了。这可能会导致其他问题,尽管这取决于你的查询需要处理整套汽车的频率-包括已批准和未批准的汽车,以及制造商、车型在这两个地方出现的可能异常情况。我已经为meTBH添加了三个选项,我越是考虑它,就越倾向于索引视图方法。这不需要对架构进行更改来拆分车辆,也不需要添加冗余的唯一约束/列,索引视图也不需要存储,因为它总是空的