对于复合外键,与主键的列组合是否需要/为什么引用表中的复合 UNIQUE 约束?

本教程将介绍对于复合外键,与主键的列组合是否需要/为什么引用表中的复合 UNIQUE 约束?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

对于复合外键,与主键的列组合是否需要/为什么引用表中的复合 UNIQUE 约束? 教程 第1张

问题描述

我有一个关于明确定义某事物的独特性的问题.这与复合外键的创建有关.我在下面创建了一个示例,以尝试使我的问题尽可能清晰(为了便于测试,我添加了一些数据插入).

[Table1] 的每个条目都必须有一个唯一的 [Name].

CREATE TABLE [Table1]
(
 [ID] INT IDENTITYNOT NULL PRIMARY KEY,
 [Name]  NVARCHAR(255) UNIQUE NOT NULL CHECK(LTRIM(RTRIM([Name])) <> '')
);

INSERT INTO [Table1]([Name])
VALUES
('Name 1'),
('Name 2'),
('Name 3'),
('Name 4'),
('Name 5'),
('Name 6'),
('Name 7')

[Table2] 中的每个 [Value] 对于每个 [Table1ID] 都必须是唯一的.

CREATE TABLE [Table2]
(
 [ID]  INT IDENTITY NOT NULL PRIMARY KEY,
 [Table1ID]  INT NOT NULL FOREIGN KEY REFERENCES [Table1]([ID]),
 [Value]  NVARCHAR(255)NOT NULL CHECK(LTRIM(RTRIM([Value])) <> ''),

 --UNIQUE([ID], [Table1ID]),
 UNIQUE([Table1ID], [Value])
);

INSERT INTO [Table2]([Table1ID], [Value])
VALUES
(1, 'Entry 1'),
(1, 'Entry 2'),
(1, 'Entry 3'),
(1, 'Entry 4'),
(3, 'Entry 5'),
(3, 'Entry 6'),
(3, 'Entry 7')

[Table1ID][Table2ID] 中的每个组合 [Table3] 必须在 [Table2] 中具有匹配的组合 (我假设 [Table1ID][Table2ID] 的两个 FOREIGN KEY 将是多余的,如果复合外键是否到位?).

CREATE TABLE [Table3]
(
 [ID]  INT IDENTITY NOT NULL,
 [Table1ID]  INT NOT NULL FOREIGN KEY REFERENCES [Table1]([ID]),
 [Table2ID]  INT NOT NULL FOREIGN KEY REFERENCES [Table2]([ID]),

 FOREIGN KEY ([Table2ID], [Table1ID]) REFERENCES [Table2](ID, [Table1ID])
);

INSERT INTO [Table3]([Table2ID], [Table1ID])
VALUES
(5, 3)

[Table3] 中的复合 FOREIGN KEY 约束是问题所在.如果 [Table2] 中被注释掉的 UNIQUE 约束没有被注释,则 [Table3] 可以成功创建.如果不是,[Table3] 的创建将失败,提示引用的表中没有与外键中的引用列列表匹配的主键或候选键".

我了解键的唯一性需要,但是因为 [Table2][ID] 列是 PRIMARY KEY并且永远是唯一的,为什么 [Table1ID] 列在 [Table2] 中不是唯一的,会阻止 [ID] 和 <[Table2] 中的code>[Table1ID] 是否唯一?

基本上, UNIQUE([ID], [Table1ID]) 部分对我来说似乎是多余的,但似乎 [Table1ID] 的唯一性>[Table2] 必须显式定义,以便 SQL Server 允许在 [Table3] 中创建复合外键.

真的是这样吗?为了允许上述情况,需要这种约束,无论它看起来多么多余?还是我错过了什么?

推荐答案

实际上更多的是与关系数据库的理论方面有关.

在其父表中引用的外键不是一组任意的列,无论它们多么独特;它引用一个键 - 主键或备用键.并且这个键必须明确声明.

好了关于对于复合外键,与主键的列组合是否需要/为什么引用表中的复合 UNIQUE 约束?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。