您好,
我有一个表团队和一个表驱动程序。每个团队有2名司机。插入一个禁止0或1个驱动程序的团队
以下交易没问题。
INSERT INTO team (id, name, nationality) VALUES (1, 'Mercedes', 'German');
INSERT INTO driver (id, firstname, lastname, team_id) VALUES (10, 'Lewis', 'Hamilton', 1);
INSERT INTO driver (id, firstname, lastname, team_id) VALUES (20, 'Nico', 'Rosberg', 1);
COMMIT;
以下交易不合适。
INSERT INTO team (id, name, nationality) VALUES (1, 'Mercedes', 'German');
INSERT INTO driver (id, firstname, lastname, team_id) VALUES (10, 'Lewis', 'Hamilton', 1);
COMMIT;
我想用触发器检查这个约束。但它并不存在触发BEFORE COMMIT。 如何实现每个团队需要2个驱动程序的约束?换句话说,我只想检查交易是否正常。
由于
答案 0 :(得分:0)
您可以通过重组数据来实现此目的。而不是让司机引用团队,让团队参考驱动程序:
create table team (
. . .
driver1 int not null,
driver2 int not null,
. . .
foreign key (driver1) references driver(id),
foreign key (driver2) references driver(id),
check (driver1 <> driver2)
);
然后数据结构会自动强制执行此约束,因为您必须填充两个有效驱动程序且不相等的值。
答案 1 :(得分:0)
我选择表格团队和司机只是为了解问题。我想检查模型中的最小基数。换句话说,该团队可能有3个,4个,5个......司机,但至少有2个司机。此外,每个司机都属于一个团队。在您的回复中,我们无法确定每个驱动程序是否属于某个团队(驱动程序可能位于没有团队的数据库中)。
必须使用触发器和过程来检查此约束。我想在提交前检查交易。但是,我不知道如何在每行之后触发一个过程,而是仅在提交之前触发。