[英]SQL Server - Create an identifying relationship
我目前正在设计要在SQL Server中实现的数据库。 我没有问题地创建了以下表格:
CREATE TABLE [Client] (
[ClientId] INT NOT NULL,
[Name] VARCHAR(45) NOT NULL,
[IsEnabled] BIT NOT NULL DEFAULT 1,
CONSTRAINT PK_TCASystem PRIMARY KEY CLUSTERED (
ClientId
)
);
CREATE TABLE [Configuration] (
[ConfigId] INT NOT NULL,
[ClientId] INT NOT NULL,
[Name] VARCHAR(45) NOT NULL,
CONSTRAINT PK_Configuration PRIMARY KEY CLUSTERED (
ConfigId, ClientId
),
CONSTRAINT "FK_SystemConfiguration" FOREIGN KEY
(
ClientId
) REFERENCES [Client] (
ClientId
)
);
但是,当我尝试添加此代码时:
CREATE TABLE [Mail] (
[MailId] INT NOT NULL,
[ConfigId] INT NOT NULL,
[Recipient] VARCHAR(500) NOT NULL,
[Sender] VARCHAR(50) NOT NULL,
[Subject] VARCHAR(250) NOT NULL,
[Message] TEXT NULL,
CONSTRAINT PK_Mail PRIMARY KEY CLUSTERED (
MailId, ConfigId
),
CONSTRAINT "FK_ConfigurationMail" FOREIGN KEY
(
ConfigId
) REFERENCES [Configuration] (
ConfigId
)
);
我收到一个错误消息,指出There are no primary or candidate keys in the referenced table 'Configuration' that match the referencing column list in the foreign key 'FK_ConfigurationMail'
。 我相信这是因为约束正在尝试引用ConfigId
,只有复合键的一半,并且要使其正常工作,我还需要引用ClientId
,对吗?
但是我的问题是我首先在MYSQL Workbench中对此数据库进行了设计,并且在那里我指出Configuration
和Mail
以及Client and Configuration
具有1:n的标识关系(因为如果存在,则无法创建Mail
实例)首先不是Configuration
实例,并且同时没有首先分配给Client
的Configuration
实例就不存在),因此,它为Configuration
和Mail
创建了组合键。 你可以在这里看到一张照片。
所以我的问题是,如何将这种识别关系转换为SQL Server? 还是不可能?
编辑 :按照建议,我将从Configuration
表中删除复合键,尽管我的问题仍然存在: 如果我有一个1:n的识别关系,其中涉及的表之一使用复合键,如何在SQL Server上显示呢? 还是这种情况永远不会发生?
第二编辑 :对于可能遇到这个问题的任何人, 这篇文章都值得一读。 消除了我对此事的困惑。
外键必须引用PK(整个PK,而不是PK的一部分)或唯一索引。 因此,将其添加到创建表[Configuration]和[Mail]之间。
CREATE UNIQUE NONCLUSTERED INDEX [UX_Configuration] ON [Configuration]([ConfigId] ASC)
在sql小提琴中查看整个工作脚本: http ://www.sqlfiddle.com/#!3/8877f
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.