所以我有这些表
student(num int, age int);
ex(id int, num int);
我想在ex中插入信息时添加一个约束来检查学生年龄是否大于20(无触发器或函数)
这是我的尝试
ALTER TABLE ex
ADD CONSTRAINT x_check CHECK((SELECT age FROM student S WHERE num=S.num )>20);
但它不起作用,任何解决方案?
答案 0 :(得分:1)
答案是CHECK是表级约束。你不能(至少据我所知)添加一个对DIFFERENT表运行select语句的约束(在FK约束之外)。
原因很简单。如果OTHER表更改(学生),那么它将不会强制执行" ex"表。
所以你可以做几件事,取决于最适合的事情:
a)无论什么脚本插入/更新,以便在插入之前检查年龄是否> = 20,否则它应该出错
b)设置一个在插入或更新之前运行的触发器来检查它,否则失败。但是必须在BOTH表上设置触发器以保持表的完整性。
希望这有帮助
答案 1 :(得分:0)
无论如何,这是无关紧要的,因为MySQL不强制执行检查约束。但是,您可以使用外键约束执行某些操作。您希望确保ex
中的学生超过20岁。
理想情况下,您只需将student
表更改为具有以下列的列:
alter table student add StudentOver20 as (case when age > 20 then num end);
alter table student add key (StudentOver20);
然后,此列的外键将强制执行约束:
alter table ex add foreign key (num) references student(StudentOver20)
不幸的是,在MySQL中,您无法使用类似的值添加列。相反,您需要更新值:
alter table student add StudentOver20 int;
update student set StudentOver20 = (case when age > 20 then num end);
如果您想让它保持最新,那么您需要添加一个触发器。当然,如果您要添加触发器,也可以将其添加到ex
以执行触发器检查。
请注意,将age
存储在表格中是一个坏主意。从现在开始,这些价值肯定是不正确的。