仅使用一个主键创建一对一关系

时间:2016-08-29 19:44:37

标签: sql sql-server sql-server-2008-r2 relation

在我的工作中,检查数据库图表我发现两个表之间存在一对一的关系,但关系不在两个主键之间,关系是在一个表中的主键和其他非主键之间另一个表中的属性。在数据库中,图表显示为“一对一关系”。我想知道如何在一个表上只使用一个主要表并在另一个表中使用非主键来创建这种“一对一”关系。

enter image description here

以下是我在数据库中找到的“创建”脚本

---------------创建表格协议文件--------------

CREATE TABLE [dbo].[AgreementDocuments](
    [AgreementDocumentID] [int] IDENTITY(1,1) NOT NULL,
    [AgreementID] [int] NOT NULL,
    [Document] [varbinary](max) NOT NULL,
 CONSTRAINT [PK_AgreementDocuments] PRIMARY KEY CLUSTERED 
 ([AgreementDocumentID] ASC) WITH (PAD_INDEX  = OFF,
 STATISTICS_NORECOMPUTE  = OFF,
 IGNORE_DUP_KEY = OFF, 
 ALLOW_ROW_LOCKS  = ON,
 ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
 ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
ALTER TABLE [dbo].[AgreementDocuments]  WITH CHECK ADD  CONSTRAINT     
[FK_AgreementDocuments_Agreements] FOREIGN KEY([AgreementID])
REFERENCES [dbo].[Agreements] ([AgreementID])    
GO
ALTER TABLE [dbo].[AgreementDocuments] CHECK CONSTRAINT   
[FK_AgreementDocuments_Agreements]
GO

--------------------------创建表协议----------------- ------

CREATE TABLE [dbo].[Agreements](
[AgreementID] [int] IDENTITY(1,1) NOT NULL,
[ContactID] [int] NOT NULL,
[ClientID] [int] NOT NULL,
CONSTRAINT [PK_Agreements] PRIMARY KEY CLUSTERED 
([AgreementID] ASC) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  =   
OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]GO

如果我在一个单独的数据库中运行这两个查询,它会创建两个具有“一对多”关系的表。怎么可能?

2 个答案:

答案 0 :(得分:1)

您可以通过向UNIQUE CONSTRAINT字段添加AgreementID来实现这种一对一的关系:

ALTER TABLE dbo.AgreementDocuments 
ADD CONSTRAINT uq_AgreementDocuments_AgreementId UNIQUE (AgreementId)

使用唯一约束,它将强制它是一对一,而不是一对多:

在约束之前:

enter image description here

约束后:

enter image description here

答案 1 :(得分:0)

创建具有标识ID列的表1。 AgreementDocumentID是标识和不同的

在另一个表中,执行第一个表AgreementDocumentID字段的外键。然后在第二个表上为AgreementDocumentID添加一个不同的索引。

如果我理解你的问题。

没有Er-Digram工具100%工作,您必须编辑他们创建的内容以使其正确。根据工具质量,您的编辑量会发生变化。