我的SQL Server数据库中有两个表Foo和Bar。 Table Foo就像这样:
+-------+
| Foo |
+-------+
| Id |
| Type |
| Value |
+-------+
该表的值如下:
+----+--------+-----------+
| Id | Type | Value |
+----+--------+-----------+
| 1 | Status | New |
| 2 | Status | Old |
| 3 | Type | Car |
| 4 | State | Inventory |
| 5 | State | Sold |
+----+--------+-----------+
表格Bar就像这样:
+----------+
| Bar |
+----------+
| Id |
| TypeId |
| StatusId |
| StateId |
+----------+
其中TypeId
,StatusId
和StateId
都是Foo表的外键。
但是我想在每个外键上设置一个条件,使它们只能键到Foo
与它的类型相关的ID。例如,TypeId
列只能使用ID的外键
3在Foo桌上。或StatusId
列只能将外键指向ID 1或2。
我知道SQL Server中有一个检查功能,但是我不确定如何正确使用它。一世 试图做这样的事情:
CREATE TABLE TEST.dbo.Bar
(
Id int PRIMARY KEY NOT NULL IDENTITY,
TypeId int NOT NULL CHECK (Type='Type'),
CONSTRAINT FK_Bar_Foo_Type FOREIGN KEY (TypeId) REFERENCES Foo (Id, Type)
)
CREATE UNIQUE INDEX Bar_Id_uindex ON TEST.dbo.Bar (Id)
但这没用。我在做什么错了?
答案 0 :(得分:0)
您所引用的检查约束仅用于限制存储在键或非键列中的信息的类型。因此,如果您不希望键列具有负值(可以说它是价格列,并且永远不会有负价),则可以使用Check约束。
为了更好地理解主键和外键的概念,
主键唯一标识表中的每个记录。 外键是某个表中的值,它是另一个表中的唯一标识符(也可以是主键)。这意味着外键可以在其中作为外键的表中重复很多次,并且在创建它的表中(在赋予它含义的表中)绝对是唯一的。
现在问您的问题,您可能需要使用复合键的概念。组合键基本上是由两个或多个值组成的组,它们唯一地标识一条记录,因为您不能以您打算的方式对外键进行限制,因为这违反了键的用途。在应用层而不是数据库层处理密钥中存储的数据类型的某些问题。
以这种方式查看问题还将从概念上解决表格的一些设计缺陷。