检查多个条件的约束
Check constraint for multiple conditions
老师给了我们一个团队作业,我和我的队友都在努力(特别是因为我们需要使用 TRIGGERS 和 PROCEDURES ,我们在 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_PINS
。 CONNECTION_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 的来源:CONNECTIONS
。 CONNECTIONS
有 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
...假设所有三个字段都不可为空。
老师给了我们一个团队作业,我和我的队友都在努力(特别是因为我们需要使用 TRIGGERS 和 PROCEDURES ,我们在 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_PINS
。 CONNECTION_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 的来源:CONNECTIONS
。 CONNECTIONS
有 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
...假设所有三个字段都不可为空。