复合键 table 和非主键 table 之间的关系
Relationship between composite keyed table & non primary key table
我有两个table,分别命名为ORDER_HEAD和ORDER_DETAIL,下面是它们的结构。
ORDER_HEAD:
ORD_ID (PK)
ORD_TYPE (PK)
ORD_DATE
ORD_NET_TOTAL
ORDER_DETAIL:
ODD_ID
ODD_LINE_NO
ODD_PRODUCT_ID
ODD_QTY
我想在 ORDER_HEAD
中的 ORD_ID
和 ORDER_DETAIL
table 中的 ODD_ID
之间建立关系。但是 SQL 服务器显示一条错误消息:
primary key or unique constraint must be defined for table before it can participate in a relationship
为什么会出现此错误?有没有办法在这两列之间执行连接,或者我的数据库设计有问题?
更新
在重新考虑问题后,我认为您应该通过添加参考列 ODD_TYPE
(如用户@NoDisplayName 所述)并为您的 table ORDER_DETAIL
创建复合 PK 来实现您的目标,其中包括3列(ODD_ID, ODD_TYPE, ODD_LINE_NO)
,则为:
ORDER_DETAIL
============
ODD_ID (PK)
ODD_TYPE (PK)
ODD_LINE_NO (PK)
ODD_PRODUCT_ID
ODD_QTY
在 SQL 中可能是:
ALTER TABLE ORDER_DETAIL ADD CONSTRAINT PK_Order_Detail PRIMARY KEY NONCLUSTERED (ODD_ID, ODD_TYPE, ODD_LINE_NO)
然后,在 ORDER_DETAIL
table 中,对于特定的货币对 (ODD_ID
, ODD_TYPE
),您将有记录作为其订单行。
我认为在删除之前的 PK、添加列并设置上面的键(即使在可视化编辑器中)之后,在两个 table 之间创建 FK 并映射正确的时应该不会有问题列在一起。
如果您想从 Composite primary key
创建关系,那么任何引用还应包括 Composite primary key
中的所有列
ORDER_DETAIL
的 Schema
应该是
ORDER_DETAIL
============
ODD_ID (Fk)
ORD_TYPE(Fk) -- you need to add this column
ODD_LINE_NO
ODD_PRODUCT_ID
ODD_QTY
像这样创建Foreign key
。
ALTER TABLE ORDER_DETAIL
ADD CONSTRAINT FK_ORDER_DETAIL
FOREIGN KEY(ODD_ID, ORD_TYPE) REFERENCES ORDER_HEAD(ODD_ID, ORD_TYPE)
我有两个table,分别命名为ORDER_HEAD和ORDER_DETAIL,下面是它们的结构。
ORDER_HEAD:
ORD_ID (PK)
ORD_TYPE (PK)
ORD_DATE
ORD_NET_TOTAL
ORDER_DETAIL:
ODD_ID
ODD_LINE_NO
ODD_PRODUCT_ID
ODD_QTY
我想在 ORDER_HEAD
中的 ORD_ID
和 ORDER_DETAIL
table 中的 ODD_ID
之间建立关系。但是 SQL 服务器显示一条错误消息:
primary key or unique constraint must be defined for table before it can participate in a relationship
为什么会出现此错误?有没有办法在这两列之间执行连接,或者我的数据库设计有问题?
更新
在重新考虑问题后,我认为您应该通过添加参考列 ODD_TYPE
(如用户@NoDisplayName 所述)并为您的 table ORDER_DETAIL
创建复合 PK 来实现您的目标,其中包括3列(ODD_ID, ODD_TYPE, ODD_LINE_NO)
,则为:
ORDER_DETAIL
============
ODD_ID (PK)
ODD_TYPE (PK)
ODD_LINE_NO (PK)
ODD_PRODUCT_ID
ODD_QTY
在 SQL 中可能是:
ALTER TABLE ORDER_DETAIL ADD CONSTRAINT PK_Order_Detail PRIMARY KEY NONCLUSTERED (ODD_ID, ODD_TYPE, ODD_LINE_NO)
然后,在 ORDER_DETAIL
table 中,对于特定的货币对 (ODD_ID
, ODD_TYPE
),您将有记录作为其订单行。
我认为在删除之前的 PK、添加列并设置上面的键(即使在可视化编辑器中)之后,在两个 table 之间创建 FK 并映射正确的时应该不会有问题列在一起。
如果您想从 Composite primary key
创建关系,那么任何引用还应包括 Composite primary key
ORDER_DETAIL
的 Schema
应该是
ORDER_DETAIL
============
ODD_ID (Fk)
ORD_TYPE(Fk) -- you need to add this column
ODD_LINE_NO
ODD_PRODUCT_ID
ODD_QTY
像这样创建Foreign key
。
ALTER TABLE ORDER_DETAIL
ADD CONSTRAINT FK_ORDER_DETAIL
FOREIGN KEY(ODD_ID, ORD_TYPE) REFERENCES ORDER_HEAD(ODD_ID, ORD_TYPE)