簡體   English   中英

外鍵上的外鍵-SQL Server

[英]Foreign key on a Foreign key - SQL Server

我正在為一個項目創建數據庫,在該數據庫中,為了檢查約束,我需要在另一個外鍵上聲明一個外鍵。

我有一個Person表和一個Groups表,它們都包含DepartmentID 每當我插入到一個新的任務Task表,我想檢查Groups.DepartmentID比賽Person.DepartmentID

這個想法是,一個任務鏈接到一個人,並且有兩種類型,一個是定義數據庫工作,財務工作等的組類型,另一個是定義它的維護,培訓等的任務類型。不適用於他/她部門的groupType應該失敗。

我嘗試將這些屬性作為外鍵添加到Task表中,但是在Microsoft SQL Server中不接受在非唯一或非主鍵上聲明外鍵( PersonGroup表中的DepartmentID不能唯一! )。

有人知道如何解決這個問題嗎?

CREATE TABLE Department 
(
    ID int PRIMARY KEY IDENTITY,
    Name varchar(50),
    UNIQUE ("Name")
)

CREATE TABLE Groups
(
    ID int IDENTITY,
    GroupType varchar(50) PRIMARY KEY,
    Description varchar(255) DEFAULT ('-'),
    DepartmentID int 
        FOREIGN KEY (DepartmentID) REFERENCES Department(ID),
)

CREATE TABLE Person 
(
    ID int PRIMARY KEY IDENTITY,
    Name varchar(50),
    DepartmentID int 
         FOREIGN KEY (DepartmentID) REFERENCES Department(ID)
)

CREATE TABLE TaskType
(
    ID int IDENTITY,
    TaskType varchar(50) PRIMARY KEY,
    Description varchar(255) DEFAULT ('-'), 
)

CREATE TABLE Task
(
    ID int IDENTITY,
    TimeFrame decimal(4,2),
    Yearcount int,
    GroupType varchar(50),
    TaskType varchar(50), 
    WeekNr int,
    ExceptionDetail varchar(255) DEFAULT ('-'),
    PersonID int
)

這些是任務表中不接受的FK屬性:

GDID int FOREIGN KEY REFERENCES Groups(DepartmentID),
PDID int FOREIGN KEY REFERENCES Person(DepartmentID),
CHECK (GDID = PDID),    

UNIQUE ("TaskType", "GroupType", "WeekNr", "Yearcount"),
FOREIGN KEY (TaskType) REFERENCES TaskType(TaskType),
FOREIGN KEY (PersonID) REFERENCES Person(ID),
FOREIGN KEY (GroupType) REFERENCES Groups(GroupType)

向包含主鍵其他列1的表中添加更寬的“超級鍵”,然后使用它們聲明外鍵。 是否還刪除多余的較小的外鍵取決於您的口味:

CREATE TABLE Groups(
ID int IDENTITY,
GroupType varchar(50) PRIMARY KEY,
Description varchar(255) DEFAULT ('-'),
DepartmentID int FOREIGN KEY (DepartmentID) REFERENCES Department(ID),
constraint Group_Dep_XRef UNIQUE (GroupType,DepartmentID)
)

CREATE TABLE Person(
ID int PRIMARY KEY IDENTITY,
Name varchar(50),
DepartmentID int FOREIGN KEY (DepartmentID) REFERENCES Department(ID),
constraint Person_Dept_XRef UNIQUE (ID,DepartmentID)
)

CREATE TABLE Task(
ID int IDENTITY,
TimeFrame decimal(4,2),
Yearcount int,
GroupType varchar(50),
TaskType varchar(50), 
WeekNr int,
ExceptionDetail varchar(255) DEFAULT ('-'),
PersonID int,
DepartmentID int,
constraint FK_Group_Dept_XRef FOREIGN KEY (GroupType,DepartmentID)
        references Group (GroupType,DepartmentID),
constraint FK_Person_Dept_XRef FOREIGN KEY (PersonID,DepartmentID)
        references Person (ID,DepartmentID),
UNIQUE ("TaskType", "GroupType", "WeekNr", "Yearcount"),
FOREIGN KEY (TaskType) REFERENCES TaskType(TaskType),
FOREIGN KEY (PersonID) REFERENCES Person(ID), --Redundant now
FOREIGN KEY (GroupType) REFERENCES Groups(GroupType) --Also redundant
)

(我還將GDIDPDID合並到DepartmentID -如果始終要相等,為什么還要存儲兩次,然后又必須具有另一個約束來聲明其相等性?)


1如果主鍵(或唯一鍵)足以唯一地標識每一行,則包括鍵列其他列的任何更寬的鍵也必須足以唯一地識別每一行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM