为什么我可以用外键约束*输入值

问题描述:

我创建了两个表,做了以下内容:为什么我可以用外键约束*输入值

表1(学生)

CREATE TABLE student(s int, n int, d int, PRIMARY KEY(s), FOREIGN KEY(d) REFERENCES dep(d)); 

表2:(DEP)

CREATE TABLE dep(d int, n int, PRIMARY KEY(d)); 

所以,如果我理解正确,d是表1的外键,它引用了部门的主键。因此,dep的主键必须与学生中的d相匹配。然而,当我做以下

INSERT INTO dep (1,2); 

该声明完成没有错误?学生表是空的,如何在参考主键时插入数据?

请帮忙,谢谢。

顺便我也能够*地插入到学生甚至dep没有相应的价值。你们认为这是因为MySQL与甲骨文?

mysql> select * from student; 
+---+------+------+ 
| s | n | d | 
+---+------+------+ 
| 5 | 5 | 5 | 
+---+------+------+ 
1 row in set (0.00 sec) 

mysql> select * from dep; 
+---+------+ 
| d | n | 
+---+------+ 
| 1 | 2 | 
+---+------+ 
1 row in set (0.00 sec) 

学生表具有外键d,它是dep表的主键。学生表是依赖于dep表的人。 dep表对学生表没有这种依赖性。学生表上的约束条件是应该始终在dep表中。

将一条记录插入到学生表中,其中d的值无效将导致错误。

+0

嗯,我能够*地插入随机数的学生,你认为它是因为它是其他SQL比Orable? – eastboundr 2012-04-13 04:19:39

+0

它无关,与它是SQL或Oracle。你怎么能够插入学生表?在创建外键约束之前还是之后?你肯定对student.d随机值是不是在DEP表? – rikitikitik 2012-04-13 04:22:13

你已经理解了错误的方法。你已经在你的SQL做的是确保当你输入一个Student,为d值必须在dep.d

存在的价值,如果你说

insert into student values (1, 2, 3) 

然后,如果有这将不会失败排在depd等于3

您可以插入department表上仍然有此表没有限制。

如果您尝试使用部门表中不存在的随机部门号在学生表中添加一行,则会给出约束错误。

例子:如果你会尝试

insert into student values (1, 4, 1034); 

,如果有部门表中没有行与主键1034值,那么它会给外键约束。

你需要做的是从父母开始往下插入你的数据。

如果您需要删除实际必须以其他方式删除的数据,请在删除父项目记录之前删除项目。

像往常一样,当你将数据插入到细节表和主表没有对应的值,你得到一个错误 - “不能添加或更新子行,外键约束失败......”。

但当FOREIGN_KEY_CHECKS变量设置为0时,MySQL忽略外键约束 -

SET FOREIGN_KEY_CHECKS=0; 
INSERT INTO student VALUES (5,5,5); -- no errors 
SET FOREIGN_KEY_CHECKS=1;