检查多个条件的约束

Check constraint for multiple conditions

老师给了我们一个团队作业,我和我的队友都在努力(特别是因为我们需要使用 TRIGGERSPROCEDURES ,我们在 class 中还没有看到的东西……)。

我们需要实现一个 arc-relationship,但我们不明白如何…… 但是在我告诉你们我需要完成什么之前,我会给你们一部分任务的描述,这样你们可以更好地了解情况......

我们基本上需要为 VLSI CAD 系统 制作 ERD,并且我们需要实施它。现在,我们有了 CELL 实体,它的属性并不真正相关......为了帮助我们,你们唯一需要知道的是它有一个 主键 , CELL_CODE, 这是一个 VARCHAR.

每个CELL有很多(我想至少有四个,我不认为你可以有三角形CELLS,但无所谓)SIDES。一个 SIDE 可以通过它的 CELL 在逻辑上识别,并且使事情变得非常困难,每个 SIDE 必须由它的 CELL 编号,就像这样:

单元格:

CELL_CODE
1
2

侧面:

SEQUENCE_NUMBER  CELL_CODE
1                1
2                1
3                1
1                2
2                2
3                2

现在,每个 SIDE 都有自己的 CONNECTION_PINSCONNECTION_PINS也是由SIDES唯一标识的,它们的编号方式基本类似:

单元格:

CELL_CODE
1
2

侧面:

SEQUENCE_NUMBER  CELL_CODE
1                1
2                1
3                1
1                2
2                2
3                2

CONNECTION_PINS:

SEQUENCE_NUMBER  SIE_SEQUENCE_NUMBER  CELL_CODE
1                1                    1
2                1                    1
1                2                    1
2                2                    1
1                3                    1
2                3                    1
1                1                    2
2                1                    2
1                2                    2
2                2                    2
1                3                    2
2                3                    2

我试图解释我们在这里遇到的编号问题:Data model - PRIMARY KEY numbering issue,但是,是的,我没有真正按照应该解释的方式解释它...

现在,我们有了最后一个实体,这就是 Arc 的来源:CONNECTIONSCONNECTIONS 有 2 个 CONNECTION_PINS:一个用于 START_FROM,一个用于 END_OF。现在,从逻辑上看,对于给定的连接,起始引脚也不能成为结束引脚。这就是我们的斗争。基本上,这是不允许的:

单元格:

CELL_CODE
1
2

侧面:

SEQUENCE_NUMBER  CELL_CODE
1                1
2                1
3                1
1                2
2                2
3                2

CONNECTION_PINS:

SEQUENCE_NUMBER  SIE_SEQUENCE_NUMBER  CELL_CODE
1                1                    1
2                1                    1
1                2                    1
2                2                    1
1                3                    1
2                3                    1
1                1                    2
2                1                    2
1                2                    2
2                2                    2
1                3                    2
2                3                    2

连接数:
(你不应该把这个放进去……)

CPI_SEQNUM_START  SIE_SEQNUM_START  CELL_CODE_START  CPI_SEQNUM_END  SIE_SEQNUM_END  CELL_CODE_END
1                 1                 1                1               1               1

现在,这基本上是这部分的 ERD:

ERD with barred relationships and the arc-relationship in question

这是实物模型:

Physical model

我基本上认为一个简单的 CHECK 可能会做 (CHECK (CPI_SEQNUM_START <> CPI_SEQNUM_END AND CELL_CODE_START <> CELL_CODE_END AND SIE_SEQNUM_START <> SIE_SEQNUM_END) ),但这阻止了我们以某种方式插入任何东西……有什么建议吗?

您使用 CHECK 约束的方法是正确的。但是,您的约束逻辑是错误的。你需要一个 OR 条件。三个字段中只有一个需要不同。

CPI_SEQNUM_START <> CPI_SEQNUM_END OR
CELL_CODE_START <> CELL_CODE_END OR
SIE_SEQNUM_START <> SIE_SEQNUM

...假设所有三个字段都不可为空。