1

当我尝试在 MySQL 中创建表时,我遇到了一个奇怪的问题。

我想要一个交叉引用两个多对多表,这是我创建表的代码

create table teacher(
t_id char(10) not null unique, 
name varchar(20) not null, 
sur_name varchar(20) not null, 
CONSTRAINT pk_teacher PRIMARY KEY(t_id))

create table student(
s_id char(10) not null unique,
name varchar(20) not null,
sur_name varchar(20) not null,
CONSTRAINT pk_student PRIMARY KEY(s_id))

create table teacher_student(
t_id char(10) not null,
s_id char(10) not null,
CONSTRAINT pk_teacher_student PRIMARY KEY(t_id, s_id))

为了添加外部约束,我使用了以下代码

ALTER TABLE teacher_student 
ADD CONSTRAINT fk_teacher_student FOREIGN KEY(s_id) REFERENCES student(s_id)
ALTER TABLE teacher_student 
ADD CONSTRAINT fk_student_teacher FOREIGN KEY(t_id) REFERENCES teacher(t_id)
ALTER TABLE student 
ADD CONSTRAINT fk_student_teacher_student 
FOREIGN KEY(s_id) REFERENCES teacher_student(s_id)
ALTER TABLE teacher 
ADD CONSTRAINT fk_teacher_teacher_student
FOREIGN KEY(t_id) REFERENCES teacher_student(t_id)

效果很好,但是如果我尝试像这样以不同的顺序执行代码

ALTER TABLE student 
ADD CONSTRAINT fk_student_teacher_student 
FOREIGN KEY(s_id) REFERENCES teacher_student(s_id)
ALTER TABLE teacher 
ADD CONSTRAINT fk_teacher_teacher_student
FOREIGN KEY(t_id) REFERENCES teacher_student(t_id)
ALTER TABLE teacher_student 
ADD CONSTRAINT fk_teacher_student FOREIGN KEY(s_id) REFERENCES student(s_id)
ALTER TABLE teacher_student 
ADD CONSTRAINT fk_student_teacher FOREIGN KEY(t_id) REFERENCES teacher(t_id)
ALTER TABLE student

我得到了例外

Can't create table 'test.#sql-44c_37' (errno: 150)

我的问题是,为什么顺序很重要?这两种创建约束的方式有什么区别?谢谢

4

2 回答 2

0

您的某些外键似乎没有任何意义。

那些引用studentteacherfk_teacher_studentfk_student_teacher)很好。这实际上是一个多对多表引用正在实现多对多关系的两个实体表中的每一个的典型案例。

现在,您对从这些表引用回多对多表有何建议?我承认我无法真正解释为什么使用第一个脚本成功添加了外键而在另一个脚本中失败了。对于那个很抱歉。尽管我有一些模糊的想法,但这并不是我回答的重点。关键是,您目前的设计将使您难以添加新数据。有了它,你就不能真正添加​​,比如说,一个学生,而不添加新学生和现有教师之间的关系。这是因为 in 中的一行student应该引用 中的现有学生teacher_student,但由于它是新学生,因此 in 中teacher_student还没有对应的行。新老师也一样。

所以,考虑放弃fk_student_teacher_studentand的想法fk_teacher_teacher_student。您的设计不需要它们。它们已经使您解决了不必要的问题,并且将来可能会造成更多麻烦。

于 2013-02-05T07:17:07.893 回答
0

“我尝试像这样以不同的顺序执行代码”你没有不同的顺序,你有非常不同的约束。你不能创建这样的约束。查看本文以获取更多信息

外键约束

于 2013-02-04T08:19:37.670 回答