【问题标题】:Creating one-to-one relation using just one primary key仅使用一个主键创建一对一关系
【发布时间】:2016-08-29 19:44:37
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    约束前:

    约束后:

    【讨论】:

    • 有了这个解决方案,还有什么理由再保留AgreementDocumentID 字段吗? AgreementID 列能否充当AgreementDocuments 表的PK、FK 和标识?
    【解决方案2】:

    使用标识 ID 列创建表一。 AgreementDocumentID 具有标识性和独特性

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

    如果我理解你的问题。

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

    【讨论】:

      猜你喜欢
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-14
      相关资源
      最近更新 更多