有三个表直接客户,代理客户,销售
主键用红色下划线标记:
如何使用其他两个表为sales表设置外键。我希望启用外键,以便:
销售表-销售类型(销售表中“直接客户”或“代理客户”的外键)。
可以向直接客户(dc_id)或通过代理客户(ac_ID)进行销售。例如,只有代理通过销售,我可以在销售表中指定代理ID作为外键,因此在sales表中无需定义Sales_Type。问题不仅仅是一个表与销售表的互连。能否在销售表中使用直接客户ID (DC_ID)、外键和代理客户(AC_ID)?select sales表(内部连接)中有一个问题。
注:如果在销售表中选择“销售类型”中的“直接客户/代理客户”。我不知道如何在销售表(销售类型)中分配外键。
在销售表中分配外键后,如何选择销售表(直接客户智能,代理智能,等等)?你能用SQLFiddle给我举个例子吗?
发布于 2016-02-18 22:37:20
您需要将列添加到您的Sales表中,或者在Direct_Customer和Agent_Customer之间创建连接表到Sales,因为您不能在同一列上放置多个Foreign。连接表是保留传统关系模型的首选方法:
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)
)
如果无法创建新表,则可以执行以下操作:
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行,并且可能会使查询更加困难,则这将导致可能的空值。如果你能避免的话,我不会推荐这种方法。
https://dba.stackexchange.com/questions/129718
复制相似问题