写一个 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" 上编写触发器。
在触发器中获取你要比较的数据,当数据不符合你的条件时拒绝插入或更新
如果您同意有一些冗余,则可以创建这样的约束。
这就是你所做的:
在 Training
中对 (tname, tdate, thour)
创建唯一约束:
ALTER TABLE Training ADD CONSTRAINT
UQ_Training_NameDateHour UNIQUE (tname, tdate, thour);
再添加两列到 Enrolled
:
ALTER TABLE Enrolled ADD tdate date NOT NULL;
ALTER TABLE Enrolled ADD thour int NOT NULL;
我在猜测这里的类型。它们需要匹配Training
.
中对应列的类型
让新列成为对 Training
:
的引用的一部分
ALTER TABLE Enrolled ADD CONSTRAINT
FK_Enrolled_Training FOREIGN KEY (tname, tdate, thour)
REFERENCES Training (tname, tdate, thour);
如果您已经有一个单独指向 tname
的引用,您可以将其删除。
最后,在 Enrolled
中创建唯一约束以确保 tdate
和 thour
根据 snum
:
是唯一的
ALTER TABLE Enrolled ADD CONSTRAINT
UQ_Enrolled_NumDateHour UNIQUE (snum, tdate, thour);
这样您将对 Enrolled
table 有一个正式的约束,这将确保一个学生不能同时开始培训。
当然,当您将行插入 Enrolled
时,引用必须包含所有三个部分。如果这对你来说代价太大,那么你可能不得不求助于使用触发器,。
我有三个 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" 上编写触发器。 在触发器中获取你要比较的数据,当数据不符合你的条件时拒绝插入或更新
如果您同意有一些冗余,则可以创建这样的约束。
这就是你所做的:
在
Training
中对(tname, tdate, thour)
创建唯一约束:ALTER TABLE Training ADD CONSTRAINT UQ_Training_NameDateHour UNIQUE (tname, tdate, thour);
再添加两列到
Enrolled
:ALTER TABLE Enrolled ADD tdate date NOT NULL; ALTER TABLE Enrolled ADD thour int NOT NULL;
我在猜测这里的类型。它们需要匹配
Training
. 中对应列的类型
让新列成为对
的引用的一部分Training
:ALTER TABLE Enrolled ADD CONSTRAINT FK_Enrolled_Training FOREIGN KEY (tname, tdate, thour) REFERENCES Training (tname, tdate, thour);
如果您已经有一个单独指向
tname
的引用,您可以将其删除。最后,在
是唯一的Enrolled
中创建唯一约束以确保tdate
和thour
根据snum
:ALTER TABLE Enrolled ADD CONSTRAINT UQ_Enrolled_NumDateHour UNIQUE (snum, tdate, thour);
这样您将对 Enrolled
table 有一个正式的约束,这将确保一个学生不能同时开始培训。
当然,当您将行插入 Enrolled
时,引用必须包含所有三个部分。如果这对你来说代价太大,那么你可能不得不求助于使用触发器,