簡體   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