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) 
)