为什么我可以用外键约束*输入值
问题描述:
我创建了两个表,做了以下内容:为什么我可以用外键约束*输入值
表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的值无效将导致错误。
答
你已经理解了错误的方法。你已经在你的SQL做的是确保当你输入一个Student
,为d
值必须在dep.d
存在的价值,如果你说
insert into student values (1, 2, 3)
然后,如果有这将不会失败排在dep
与d
等于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;
嗯,我能够*地插入随机数的学生,你认为它是因为它是其他SQL比Orable? – eastboundr 2012-04-13 04:19:39
它无关,与它是SQL或Oracle。你怎么能够插入学生表?在创建外键约束之前还是之后?你肯定对student.d随机值是不是在DEP表? – rikitikitik 2012-04-13 04:22:13