如何添加外键MySQL

时间:2013-11-25 13:27:37

标签: mysql foreign-keys

MySQL不断返回'无法添加外键约束'。

在重新制作之前,每次执行都会删除这些表。

目前在完成所有表格之后,我尝试改变表格以包含外键;我在创建表时尝试添加密钥,但程序返回相同的错误。

我确信每个被引用的列也具有相同的值。

CREATE TABLE utopia.student (id_student VARCHAR(6) NOT NULL, 
    Student_Name VARCHAR(45) NOT NULL, Degree VARCHAR(45) NOT NULL, 
    PRIMARY KEY (id_student));
 -- Create Student Table
CREATE TABLE utopia.module (id_module VARCHAR(6) NOT NULL, 
    Module_Name VARCHAR(45) NOT NULL, Credits Int NOT NULL, 
    PRIMARY KEY (id_module));
-- Create Module Table
 CREATE TABLE utopia.registered (id_student VARCHAR(6) NOT NULL, 
      id_module VARCHAR(6) NOT NULL, PRIMARY KEY (id_student, id_module));
-- Create Registered Table
CREATE TABLE utopia.staff (id_staff VARCHAR(6) NOT NULL, 
    Staff_Name VARCHAR(45) NOT NULL, Grade VARCHAR(45) NOT NULL, 
    PRIMARY KEY (id_staff));
-- Create Staff Table
CREATE TABLE utopia.teaches (id_staff VARCHAR(6) NOT NULL, 
     id_module VARCHAR(6) NOT NULL, PRIMARY KEY (id_staff, id_module)); 
-- Create Teaches Table

ALTER TABLE utopia.student ADD FOREIGN KEY (id_student) 
    REFERENCES registered(id_student);
ALTER TABLE utopia.module ADD FOREIGN KEY (id_module) 
    REFERENCES registered(id_module);
ALTER TABLE utopia.registered ADD FOREIGN KEY (id_student) 
    REFERENCES  student(id_student), 
    ADD FOREIGN KEY (id_module) 
    REFERENCES module(id_module);
ALTER TABLE utopia.staff ADD FOREIGN KEY idstaff REFERENCES teaches(id_staff);
ALTER TABLE utopia.teaches ADD FOREIGN KEY (id_staff) REFERENCES staff(id_staff), 
    ADD FOREIGN KEY (id_module) REFERENCES module(id_module);

有关此主题的任何建议/教程将不胜感激

2 个答案:

答案 0 :(得分:1)

如果要添加外键,父表的列必须至少为主键或唯一。在registeredid_module是复合键的一部分,并不会将其删除,只需在其上添加一个uniqe键。你也有一些缺失的括号。

SQL Fiddle

答案 1 :(得分:-1)

**use following command syntax**

ALTER TABLE table_name ADD FOREIGN KEY column_name(column_name)REFERENCES table_name(column_name)

示例

ALTER TABLE utopia.student ADD FOREIGN KEY utopia.student.id_student(id_student_fck01) 
REFERENCES utopia.registered(utopia.registered.id_student);