仅使用一个主键创建一对一关系
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% 有效,您必须编辑他们创建的内容以使其正确。根据工具质量,您的编辑量会发生变化。
在我的工作中,检查数据库图表我发现两个 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% 有效,您必须编辑他们创建的内容以使其正确。根据工具质量,您的编辑量会发生变化。