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

Creating one-to-one relation using just one primary key

在我的工作中,检查数据库图表我发现两个 table 之间存在一对一关系,但该关系不是两个主键之间的关系,而是一个主键之间的关系一个 table 和另一个 table 中的其他非主键属性。在数据库图表中显示为 "One to One relation"。我想知道如何在一个 table 上仅使用一个主键并在另一个 table.

上使用非主键来创建这种关系 "One to One"

这是我在数据库中找到的 "create" 的脚本

----------------创建table 协议文件-------------

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

------------------------创建table协议------------ ------------

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

如果我在单独的数据库中 运行 这两个查询,它会创建两个具有 "One to Many" 关系的 table。这怎么可能?

您可以通过向 AgreementID 字段添加 UNIQUE CONSTRAINT 使其成为一对一关系:

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

有了唯一约束,它会强制它是一对一的,而不是一对多的:

约束前:

约束后:

创建 table 一个带有标识 ID 列的。 AgreementDocumentID 是标识且不同的

在另一个 table 中对第一个 table AgreementDocumentID 字段做一个外键。然后在第二个 table 上为 AgreementDocumentID 添加一个不同的索引。

如果我理解你的问题。

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