复合键控表与之间的关系非主键表

时间:2015-01-10 09:16:38

标签: sql sql-server sql-server-2008

我有两个名为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

我希望在ORD_IDORDER_HEAD之间建立ODD_ID之间的关系。 ORDER_DETAIL表格中的{{1}}。但SQL Server显示错误消息:

  

必须先为表定义主键或唯一约束才能参与关系

为什么我收到此错误?有没有办法在这两列之间执行连接,或者我的数据库设计中是否存在问题?

2 个答案:

答案 0 :(得分:2)

如果您想从Composite primary key创建关系,那么任何引用都应该包含Composite primary key

中的所有列 Schema的{​​p> ORDER_DETAIL应为

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)

答案 1 :(得分:1)

<强>更新

重新思考问题后,我认为您应该通过添加引用列ODD_TYPE(如用户@NoDisplayName所述)并为您的表ORDER_DETAIL创建包含3列(ODD_ID, ODD_TYPE, ODD_LINE_NO)的复合PK来实现目标那么它会是:

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_DETAILODD_ID)的ODD_TYPE表中,您将记录为其订单行。

我认为删除之前的PK,添加列并设置上面的键(即使在可视编辑器中),在两个表之间创建FK并将正确的列映射到一起时,不应该有问题。