Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 检查另一个表中的特定值作为约束_Sql Server - Fatal编程技术网

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添加了三个选项,我越是考虑它,就越倾向于索引视图方法。这不需要对架构进行更改来拆分车辆,也不需要添加冗余的唯一约束/列,索引视图也不需要存储,因为它总是空的