[英]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.