Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 检查约束内的SQL Select查询_Mysql_Sql - Fatal编程技术网

Mysql 检查约束内的SQL Select查询

Mysql 检查约束内的SQL Select查询,mysql,sql,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); 但是它不起作用,有什么解决方案吗?无论如何,它都是不相关的,因为MySQL不强制执

所以我有这些桌子

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

但是它不起作用,有什么解决方案吗?

无论如何,它都是不相关的,因为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
存储在表中不是一个好主意。一年后,这些值肯定会不正确。

无论如何,这都是无关紧要的,因为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
存储在表中不是一个好主意。一年后,这些值肯定会不正确。

无论如何,这都是无关紧要的,因为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
存储在表中不是一个好主意。一年后,这些值肯定会不正确。

无论如何,这都是无关紧要的,因为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
存储在表中不是一个好主意。一年后这些值肯定会不正确。

答案是检查是表级约束。您不能(至少据我所知)添加对其他表运行select语句的约束(在FK约束之外)

原因很简单。如果另一个表发生更改(student),则它不会在“ex”表上强制执行完整性

所以你可以做几件事,取决于什么最适合你:

a) 插入/更新脚本以检查插入前的年龄是否大于等于20,否则将出错

b) 设置在insert或update之前运行的触发器以检查此情况,否则将失败。但是为了保持表的完整性,必须在两个表上都设置触发器


希望这有帮助。答案是检查是表级约束。您不能(至少据我所知)添加对其他表运行select语句的约束(在FK约束之外)

原因很简单。如果另一个表发生更改(student),则它不会在“ex”表上强制执行完整性

所以你可以做几件事,取决于什么最适合你:

a) 插入/更新脚本以检查插入前的年龄是否大于等于20,否则将出错

b) 设置在insert或update之前运行的触发器以检查此情况,否则将失败。但是为了保持表的完整性,必须在两个表上都设置触发器


希望这有帮助。答案是检查是表级约束。您不能(至少据我所知)添加对其他表运行select语句的约束(在FK约束之外)

原因很简单。如果另一个表发生更改(student),则它不会在“ex”表上强制执行完整性

所以你可以做几件事,取决于什么最适合你:

a) 插入/更新脚本以检查插入前的年龄是否大于等于20,否则将出错

b) 设置在insert或update之前运行的触发器以检查此情况,否则将失败。但是为了保持表的完整性,必须在两个表上都设置触发器


希望这有帮助。答案是检查是表级约束。您不能(至少据我所知)添加对其他表运行select语句的约束(在FK约束之外)

原因很简单。如果另一个表发生更改(学生),则它将不会出现