检查多个条件的约束

时间:2018-05-29 12:53:23

标签: sql oracle create-table

老师给了我们一个团队任务,我和我的队友都非常努力(特别是因为我们需要使用像 TRIGGERS PROCEDURES 这样的东西,我们在课堂上没有看到......)。

我们需要实施 arc-relationship ,我们无法理解...... 但在我告诉你们我需要完成的任务之前,我会给你一些关于任务的描述,所以你们可以更好地了解情况......

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

每个CELL都有很多(我认为至少有四个,我认为你不能有三角形CELLS,但无论如何都不重要)SIDESSIDE可以通过其CELL进行逻辑识别,并且为了使事情变得非常困难,每个SIDE都必须按其CELL进行编号,如下所示:

CELLS:

CELL_CODE
1
2

SIDES:

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

现在,每个SIDE都有CONNECTION_PINSCONNECTION_PINS也由SIDES唯一标识,基本上以类似的方式编号:

CELLS:

CELL_CODE
1
2

SIDES:

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。现在,从逻辑上看,对于给定的连接,起始引脚也不能是结束引脚。这就是我们的斗争。基本上,这不应该被允许:

CELLS:

CELL_CODE
1
2

SIDES:

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

CONNECTIONS:
(你不应该把它放进......)

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_ENDCELL_CODE_START<> CELL_CODE_ENDSIE_SEQNUM_START<> SIE_SEQNUM_END)),但这阻止我们以某种方式插入任何内容......有什么建议吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

相关问题