我想知道在引用关系中使用主键列与唯一键列之间是否存在任何缺点(在SQL Server中,外键约束只能引用主键或唯一索引中的列)。
在特定的DB系统(例如Microsoft SQL Server 2005)中,如果外键引用主键与唯一键之间存在差异,查询解析方式是否有所不同?
请注意,我并不是在询问使用不同数据类型的列进行引用完整性、连接等操作时的差异。
纯粹作为一个例子,想象一个数据库,在其中有一个“查找表”dbo.Offices:
显然,对于
在特定的DB系统(例如Microsoft SQL Server 2005)中,如果外键引用主键与唯一键之间存在差异,查询解析方式是否有所不同?
请注意,我并不是在询问使用不同数据类型的列进行引用完整性、连接等操作时的差异。
纯粹作为一个例子,想象一个数据库,在其中有一个“查找表”dbo.Offices:
CREATE TABLE dbo.Offices (
ID int NOT NULL IDENTITY(1,1) CONSTRAINT PK_Codes PRIMARY KEY,
Code varchar(50) NOT NULL CONSTRAINT UQ_Codes_Code UNIQUE
);
还有一张表格dbo.Patients
:
CREATE TABLE dbo.Patients (
ID int NOT NULL IDENTITY(1,1) CONSTRAINT PK_Patients PRIMARY KEY,
OfficeCode varchar(50) NOT NULL,
...
CONSTRAINT FK_Patients_Offices FOREIGN KEY ( OfficeCode )
REFERENCES dbo.Offices ( Code )
);
与上面T-SQL代码中的dbo.Patients
表及其约束FK_Patients_Offices
相比,以下备选版本存在哪些缺点:
CREATE TABLE dbo.Patients (
ID int NOT NULL IDENTITY(1,1) CONSTRAINT PK_Patients PRIMARY KEY,
OfficeID int NOT NULL,
...
CONSTRAINT FK_Patients_Offices FOREIGN KEY ( OfficeID )
REFERENCES dbo.Offices ( ID )
);
显然,对于
dbo.Patients
的第二个版本,如果在dbo.Offices
的Code
列中的值发生更改,则不需要更新OfficeID
列中的值。
另外(显然),使用dbo.Offices
的Code
列作为外键引用在很大程度上会削弱代理键列ID
的目的 - 这纯粹是示例的产物。[是否有更好的表格示例,其中外键引用可能合理地使用非主键?]
ON UPDATE CASCADE
。 - Damien_The_Unbeliever