交叉引用外键约束的错误

时间:2013-02-04 08:13:07

标签: sql foreign-keys

当我尝试在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)

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

2 个答案:

答案 0 :(得分:0)

“我尝试以不同的顺序执行代码”你没有不同的顺序,你有非常不同的约束。您无法创建此类约束。 检查本文以获取更多信息

FOREIGN KEY Constraints

答案 1 :(得分:0)

你的一些外键似乎没有任何意义。

引用studentteacherfk_teacher_studentfk_student_teacher个)的人很好。这实际上是一个多对多表的典型案例,它引用了实现多对多关系的两个实体表中的每一个。

现在,您提议将这些表格引用回多对多表格?我承认我无法解释为什么使用第一个脚本成功添加了外键并且另一个脚本失败了。对于那个很抱歉。虽然我有一些模糊的想法,但这并不是我的回答。关键是,您目前的设计将使您难以添加新数据。有了它,你就不能真正地添加一个学生而不添加新学生和现有教师之间的关系。这是因为student中的一行应该引用teacher_student中的现有学生,但由于它是新学生,因此teacher_student中没有相应的行。同样适合新老师。

所以,考虑放弃fk_student_teacher_studentfk_teacher_teacher_student的想法。您的设计不需要它们。他们已经让你解决了一个不必要的问题,他们将来可能会造成更多麻烦。