SQL Server子表两列引用父表同一列时外键重复显示问题求助
解决SSMS关系设计器中重复外键关系显示的问题
这个问题其实是SSMS关系图的默认行为导致的——你创建了两个独立的外键约束,分别让tblContracts.EVAT_Client和tblContracts.EVAT_Company指向tblClients.VAT_Number,所以设计器会为每个约束生成一条连接线,看起来像是重复,但它们是两个完全不同的业务关系(一个是合同的客户,一个是作为供应商的客户)。下面是几种解决显示混乱的方法:
1. 给外键约束起更清晰的名称
你的现有约束名称虽然能区分,但不够直观。可以修改约束名称,让它们的业务含义一目了然:
修改约束的SQL语句
-- 修改EVAT_Client的外键约束名称 EXEC sp_rename 'tblContracts.tblContracts_EVAT_Client_Company_FK', 'FK_tblContracts_Client_to_tblClients', 'OBJECT'; -- 修改EVAT_Company的外键约束名称 EXEC sp_rename 'tblContracts.tblContracts_EVAT_Company_FK', 'FK_tblContracts_Supplier_to_tblClients', 'OBJECT';
修改后,在SSMS关系设计器里,每条连接线的名称会直接显示新的约束名,你能立刻区分哪个是客户关联,哪个是供应商关联。
2. 在关系设计器中调整显示设置
如果不想修改数据库对象名称,也可以直接在SSMS的关系图里调整:
- 右键点击关系图中重复的连接线,选择属性
- 在属性窗口的“名称”字段,输入更易懂的标识(比如“合同-客户关联”、“合同-供应商关联”)
- 拖动连接线的端点,把两条线分开摆放,避免重叠覆盖——你可以把其中一条线连接到父表
tblClients的边缘不同位置,或者调整子表tblContracts的列顺序,让连接线的路径更清晰。
3. 确认业务逻辑的合理性
先明确:你的数据库设计是完全合理的——允许客户同时作为供应商,用两个外键指向同一个父表的设计完全符合业务需求,不需要调整表结构。SSMS里的显示问题只是界面层面的,不影响数据库的功能和完整性。
补充:你的建表代码整理
父表tblClients
CREATE TABLE tblClients ( VAT_Number NVARCHAR(30) NOT NULL PRIMARY KEY, Country_EID NVARCHAR(5) NOT NULL, User_EID NVARCHAR(50) NOT NULL, Is_Company_Group BIT NOT NULL, Recording_Date SMALLDATETIME NOT NULL CONSTRAINT DF_tblClients_Recording_Date DEFAULT CONVERT(SMALLDATETIME, GETDATE()), General_Notes NVARCHAR(300), CONSTRAINT tblClients_Country_EID_FK FOREIGN KEY (Country_EID) REFERENCES tblCountryLkp(Country_ID), CONSTRAINT tblClients_User_EID_FK FOREIGN KEY (User_EID) REFERENCES tblUsers(User_ID) );
子表tblContracts
CREATE TABLE tblContracts ( Contract_ID_Old NVARCHAR(30) NOT NULL, Contract_ID_New NVARCHAR(15) NOT NULL, EVAT_Client NVARCHAR(30) NOT NULL, Billing_Type_EID INT NOT NULL, User_EID NVARCHAR(50) NOT NULL, Type_EID INT NOT NULL, EVAT_Company NVARCHAR(30) NOT NULL, Status_EID INT NOT NULL, Recording_Date SMALLDATETIME NOT NULL CONSTRAINT DF_tblContracts_Recording_Date DEFAULT CONVERT(SMALLDATETIME, GETDATE()), PRIMARY KEY (Contract_ID_Old, Contract_ID_New), CONSTRAINT tblContracts_Billing_Type_EID_FK FOREIGN KEY (Billing_Type_EID) REFERENCES tblBillingTypeLkp(Billing_Type_ID), CONSTRAINT tblContracts_User_EID_FK FOREIGN KEY (User_EID) REFERENCES tblUsers(User_ID), CONSTRAINT tblContracts_Type_EID_FK FOREIGN KEY (Type_EID) REFERENCES tblContractTypeLkp(Contract_Type_ID), CONSTRAINT tblContracts_Status_EID_FK FOREIGN KEY (Status_EID) REFERENCES tblStatusLkp(Status_ID), CONSTRAINT tblContracts_EVAT_Client_Company_FK FOREIGN KEY (EVAT_Client) REFERENCES tblClients(VAT_Number), CONSTRAINT tblContracts_EVAT_Company_FK FOREIGN KEY (EVAT_Company) REFERENCES tblClients(VAT_Number) );
内容的提问来源于stack exchange,提问作者Simone
相关产品推荐
相关产品推荐

