SQL在检查约束

时间:2015-05-21 19:20:19

标签: mysql sql

所以我有这些表

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

但它不起作用,任何解决方案?

2 个答案:

答案 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存储在表格中是一个坏主意。从现在开始,这些价值肯定是不正确的。