2

這個問題是適用於不同的RDBMS定義外鍵約束:MySQLSQL Server強制唯一性,並從多個表

我一直在通宵尋找這一點,我無法找到它在網絡上。我的問題全是關於的唯一性外鍵。考慮以下方案:

CREATE TABLE Male 
(
    StudentID INT, 
    FirstName VARCHAR(20) NOT NULL, 
    MiddleName VARCHAR(20) NOT NULL, 
    LastName VARCHAR(20) NOT NULL, 
    -- other columns ... 
    CONSTRAINT male_PK PRIMARY KEY (StudentID), 
    CONSTRAINT male_UQ UNIQUE (FirstName, MiddleName, LastName) 
); 

CREATE TABLE Female 
(
    StudentID INT, 
    FirstName VARCHAR(20) NOT NULL, 
    MiddleName VARCHAR(20) NOT NULL, 
    LastName VARCHAR(20) NOT NULL, 
    -- other columns ... 
    CONSTRAINT Female_PK PRIMARY KEY (StudentID), 
    CONSTRAINT Female_UQ UNIQUE (FirstName, MiddleName, LastName) 
); 

CREATE TABLE ClassList 
(
    ClassID INT, 
    Name VARCHAR(30), 
    ClassYear INT, 
    -- other columns ... 
    CONSTRAINT ClassList_PK PRIMARY KEY (ClassID), 
    CONSTRAINT ClassList_UQ UNIQUE (Name, ClassYear) 
); 

爲什麼表MaleFemale分開的原因是因爲它們是由不同的SQL帳戶維護。現在


的問題是協會類

CREATE Student_Class 
(
    SudentID INT, 
    ClassID INT, 
    CONSTRAINT tb_UQ UNIQUE (StudentID, ClassID) 
) 

所以我的問題是:

  • 我如何設置的StudentID的獨特性來自兩個表MaleFemale。我無法在網上找到。
  • 如何執行Foreign Key約束,其中關聯類表的值列來自兩個表:MaleFemale

建議也被接受。

謝謝

+0

你真的想爲女性和男性的兩個表?或者這只是個例子? –

+2

爲什麼不創建顯示StudentID,Gender的第三個表。在這裏,你可以保持學生身份的獨特性,同時追蹤他們的性別。您可以在男性和女性表格中製作StudentID外鍵。 – HerpaMoTeH

+0

@HamletHakobyan它的設計,我不能改變表。我的工作是創建關聯課程。 – Walter

回答

1

我認爲讓用戶權限決定你的模式不是一個好主意,但是如果你不得不那麼我認爲HerpaMoTeH提到的想法是一個好主意。第三張帶有ID,性別並在特定性別表和student_class中用作FK的ID的表。

另一個解決方案是你的student_class表只是分成兩個: male_student_class和female_student_class

另外,您可以在單個學生表上創建2套用於CRUD操作的存儲過程(男性和女性)。然後,您將拒絕爲您的用戶使用實際表格的權限,但授予他們訪問相應的一組存儲過程的權限。您的模式將被簡化爲:

CREATE TABLE Student 
(
    StudentID INT, 
    GenderId INT, 
    FirstName VARCHAR(20) NOT NULL, 
    MiddleName VARCHAR(20) NOT NULL, 
    LastName VARCHAR(20) NOT NULL, 
    -- other columns ... 

); 


CREATE Student_Class 
(
    SudentID INT, 
    ClassID INT, 
    CONSTRAINT tb_UQ UNIQUE (StudentID, ClassID) 
) 
1

您可以:

設置一個範圍StudentID識別男/女。例如10000至19999爲男性和20000〜29999女性

或者,你可以在兩個表中添加冗餘列「性別」,其中M爲男性和F女性,使基準的那部分

Raj

2

這就是爲什麼屬性拆分不好 - 它開始以奇怪的方式「感染」其他表。

您可以:

CREATE Student_Class 
(
    MaleStudentID INT NULL, 
    FemaleStudentID INT NULL, 
    ClassID INT NOT NULL, 
    CONSTRAINT tb_UQ UNIQUE (MaleStudentID, FemaleStudentID, ClassID) 
) 

由於MySQL的,所以據我所知,不支持CHECK的限制,你還可以創建,確保只有一個觸發,並且只有一個,MaleStudentIDFemaleStudentIDNOT NULL

您現在可以以明顯的方式應用您的外鍵約束。


對於SQL Server,你有一個檢查約束:

ALTER TABLE Student_Class ADD CONSTRAINT CK_Students_Nullability CHECK (
    (MaleStudentID is null and FemaleStudentID is not null) or 
    (MaleStudentID is not null and FemaleStudentID is null) 
)