【问题标题】:How to add foreign keys MySQLMySQL如何添加外键
【发布时间】:2013-11-25 13:27:37
【问题描述】:

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

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

【问题讨论】:

  • 哪个 MySQL 版本?哪个存储引擎:MyISAM 还是 INNODB?
  • 我认为你的外键是向后的。 registered 需要到 student 的外键和到 module 的另一个外键。您的示例试图将外键放在错误的表上。有道理?换句话说,哪个先出现:studentregistered?由于student 记录首先出现,registered 有一个外键指向学生。

标签: mysql foreign-keys


【解决方案1】:

如果要添加外键,则父表的列必须至少是主列或唯一的。在registered 表中,id_module 是复合键的一部分并且不会剪切它,只需添加一个uniqe 键。您还缺少一些括号。

SQL Fiddle

【讨论】:

  • 我以为我创建外键的所有列都已经是其他表中的主键了?另外,为什么外键不能成为复合键的一部分?
  • @OneGlove 我认为如果引用的列是第一个,它可能能够引用复合主键的列,我不确定。
【解决方案2】:
**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);

【讨论】:

  • 所以以学生表为例,应该是:ALTER TABLE student ADD FOREIGN KEY (id_student) REFERENCES registered(id_student)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 2019-06-29
  • 1970-01-01
  • 2018-07-19
  • 2014-01-09
  • 2023-01-05
相关资源
最近更新 更多