0

我创建了两个表并执行了以下操作:

表一:(学生)

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

表 2:(深度)

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

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

INSERT INTO dep (1,2);

语句完成没有错误?学生表是空的,引用其主键时如何插入数据?

请帮忙,谢谢。

顺便说一句,即使 dep 没有相应的值,我也可以自由地插入到学生中。你们认为这是因为 mysql vs. oracle 吗?

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

4 回答 4

2

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

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

于 2012-04-13T04:11:12.077 回答
2

你理解错了。您在 sql 中所做的是确保当您输入 a 时Student,值 ford必须作为值存在dep.d

如果你说

insert into student values (1, 2, 3)

那么如果没有等于的行dep,这将失败d3

于 2012-04-13T04:12:01.400 回答
1

您可以插入到department 表中,因为该表没有约束。

如果您尝试在学生表中添加一行随机部门编号,而部门表中不存在该行,那么它将给您约束错误。

示例:如果你会尝试

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

如果在部门表中没有主键值的行1034,那么它将给出外键约束。

您需要做的是从父级向下插入数据。

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

于 2012-04-13T04:12:09.823 回答
0

像往常一样,当您将数据插入明细表并且主表没有对应的值时,您会收到错误 - '无法添加或更新子行:外键约束失败...'。

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

SET FOREIGN_KEY_CHECKS=0;
INSERT INTO student VALUES (5,5,5); -- no errors
SET FOREIGN_KEY_CHECKS=1;
于 2012-04-13T05:44:18.260 回答