SQL Server条件外键

时间:2018-08-17 19:00:28

标签: sql sql-server foreign-keys conditional-statements

我的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  |
+----------+

其中TypeIdStatusIdStateId都是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)

但这没用。我在做什么错了?

1 个答案:

答案 0 :(得分:0)

您所引用的检查约束仅用于限制存储在键或非键列中的信息的类型。因此,如果您不希望键列具有负值(可以说它是价格列,并且永远不会有负价),则可以使用Check约束。

为了更好地理解主键和外键的概念,

主键唯一标识表中的每个记录。 外键是某个表中的值,它是另一个表中的唯一标识符(也可以是主键)。这意味着外键可以在其中作为外键的表中重复很多次,并且在创建它的表中(在赋予它含义的表中)绝对是唯一的。

现在问您的问题,您可能需要使用复合键的概念。组合键基本上是由两个或多个值组成的组,它们唯一地标识一条记录,因为您不能以您打算的方式对外键进行限制,因为这违反了键的用途。在应用层而不是数据库层处理密钥中存储的数据类型的某些问题。

以这种方式查看问题还将从概念上解决表格的一些设计缺陷。