首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用两个表中的一个分配外键

使用两个表中的一个分配外键
EN

Database Administration用户
提问于 2016-02-18 18:10:54
回答 1查看 8.2K关注 0票数 -1

问题1:

有三个表直接客户,代理客户,销售

主键用红色下划线标记:

如何使用其他两个表为sales表设置外键。我希望启用外键,以便:

销售表-销售类型(销售表中“直接客户”或“代理客户”的外键)。

可以向直接客户(dc_id)或通过代理客户(ac_ID)进行销售。例如,只有代理通过销售,我可以在销售表中指定代理ID作为外键,因此在sales表中无需定义Sales_Type。问题不仅仅是一个表与销售表的互连。能否在销售表中使用直接客户ID (DC_ID)、外键和代理客户(AC_ID)?select sales表(内部连接)中有一个问题。

注:如果在销售表中选择“销售类型”中的“直接客户/代理客户”。我不知道如何在销售表(销售类型)中分配外键。

问题2:

在销售表中分配外键后,如何选择销售表(直接客户智能,代理智能,等等)?你能用SQLFiddle给我举个例子吗?

EN

回答 1

Database Administration用户

回答已采纳

发布于 2016-02-18 22:37:20

您需要将列添加到您的Sales表中,或者在Direct_Customer和Agent_Customer之间创建连接表到Sales,因为您不能在同一列上放置多个Foreign。连接表是保留传统关系模型的首选方法:

代码语言:javascript
运行
复制
CREATE TABLE Direct_Customer
(    
    DC_ID INT IDENTITY(1,1)
    ,DC_Name NVARCHAR(100)
    ,CONSTRAINT [PK_DirectCustomer] PRIMARY KEY (DC_ID)
)
GO
CREATE TABLE Agent_Customer
(    
    AC_ID INT IDENTITY(1,1)
    ,AC_Name NVARCHAR(100)
    ,CONSTRAINT [PK_AgentCustomer] PRIMARY KEY (AC_ID)    
)
GO
CREATE TABLE Sales
(    
    S_ID INT IDENTITY(1,1)
    ,date DATETIME
    ,Sales_Type INT
    ,CONSTRAINT [PK_Sales] PRIMARY KEY (S_ID)    
)
GO
CREATE TABLE Sales_DirectCustomer
(
    SDC_ID INT IDENTITY(1,1)
    ,DC_ID INT
    ,S_ID INT
    ,CONSTRAINT [PK_Sales_DirectCustomer] PRIMARY KEY (SDC_ID)
    ,CONSTRAINT [FK_Sales_DirectCustomer_DirectCustomer] FOREIGN KEY (DC_ID) REFERENCES [dbo].[Direct_Customer](DC_ID)
    ,CONSTRAINT [FK_Sales_DirectCustomer_Sales] FOREIGN KEY (S_ID) REFERENCES [dbo].[Sales](S_ID)
)
GO
CREATE TABLE Sales_Agent_Customer
(
    SAC_ID INT IDENTITY(1,1)
    ,AC_ID INT
    ,S_ID INT
    ,CONSTRAINT [PK_Sales_AgentCustomer] PRIMARY KEY (SAC_ID)
    ,CONSTRAINT [FK_Sales_AgentCustomer_AgentCustomer] FOREIGN KEY (AC_ID) REFERENCES [dbo].[Agent_Customer](AC_ID) 
    ,CONSTRAINT [FK_Sales_AgentCustomer_Sales] FOREIGN KEY (S_ID) REFERENCES [dbo].[Sales](S_ID)
)

如果无法创建新表,则可以执行以下操作:

代码语言:javascript
运行
复制
ALTER TABLE Sales ADD AC_ID INT NULL
GO
ALTER TABLE Sales
ADD CONSTRAINT [FK_Sales_AgentCustomer] FOREIGN KEY (AC_ID) REFERENCES [dbo].[Agent_Customer](AC_ID); 
GO
ALTER TABLE Sales ADD DC_ID INT NULL
GO
ALTER TABLE Sales
ADD CONSTRAINT [FK_Sales_DirectCustomer] FOREIGN KEY (DC_ID) REFERENCES [dbo].[Direct_Customer](DC_ID); 
GO

但是,如果两个表中只有一个涉及到一个特定的Sale行,并且可能会使查询更加困难,则这将导致可能的空值。如果你能避免的话,我不会推荐这种方法。

票数 4
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/129718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档