繁体   English   中英

SQL Server-创建标识关系

[英]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中对此数据库进行了设计,并且在那里我指出ConfigurationMail以及Client and Configuration具有1:n的标识关系(因为如果存在,则无法创建Mail实例)首先不是Configuration实例,并且同时没有首先分配给ClientConfiguration实例就不存在),因此,它为ConfigurationMail创建了组合键。 你可以在这里看到一张照片。

所以我的问题是,如何将这种识别关系转换为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM