写一个 table 约束

Writing a table constraint

我有三个 table 作为 :

学生(snum(主键),sname)

已注册 (snum,tname)

训练(tname(主键),tdate,thour,troom)

我必须对 table Enrolled 进行限制,这样学生就不能同时注册课程 (tname)。

我试过这样的东西,但我认为它只是在独特的时代给出了教训:

select tname from Training T1 where tdate not in (select tdate from Training T2 where T1.tdate=T2.tdate)

您可能需要在 "before insert" 和 "before update" 上编写触发器。 在触发器中获取你要比较的数据,当数据不符合你的条件时拒绝插入或更新

如果您同意有一些冗余,则可以创建这样的约束。

这就是你所做的:

  1. Training 中对 (tname, tdate, thour) 创建唯一约束:

    ALTER TABLE Training ADD CONSTRAINT
      UQ_Training_NameDateHour UNIQUE (tname, tdate, thour);
    
  2. 再添加两列到 Enrolled:

    ALTER TABLE Enrolled ADD tdate date NOT NULL;
    ALTER TABLE Enrolled ADD thour int NOT NULL;
    

    我在猜测这里的类型。它们需要匹配Training.

  3. 中对应列的类型
  4. 让新列成为对 Training:

    的引用的一部分
    ALTER TABLE Enrolled ADD CONSTRAINT
      FK_Enrolled_Training FOREIGN KEY (tname, tdate, thour)
                   REFERENCES Training (tname, tdate, thour);
    

    如果您已经有一个单独指向 tname 的引用,您可以将其删除。

  5. 最后,在 Enrolled 中创建唯一约束以确保 tdatethour 根据 snum:

    是唯一的
    ALTER TABLE Enrolled ADD CONSTRAINT
      UQ_Enrolled_NumDateHour UNIQUE (snum, tdate, thour);
    

这样您将对 Enrolled table 有一个正式的约束,这将确保一个学生不能同时开始培训。

当然,当您将行插入 Enrolled 时,引用必须包含所有三个部分。如果这对你来说代价太大,那么你可能不得不求助于使用触发器,