【问题标题】:MySQL, MariaDB: Cannot create a table - ERROR 1005 (HY000). Something wrong with foreign keyMySQL、MariaDB:无法创建表 - 错误 1005 (HY000)。外键有问题
【发布时间】:2013-06-03 19:34:31
【问题描述】:

我是数据库新手,在尝试创建这些表时不断收到错误消息。哪里出错了?

我发现了大量与我类似的问题,但它们并没有帮助我解决这个问题。

CREATE TABLE IF NOT EXISTS course
(
    cou_id VARCHAR(3),
    course_name VARCHAR(25),
    CONSTRAINT pk_course PRIMARY KEY (cou_id, course_name)
);

CREATE TABLE IF NOT EXISTS students_marks
(
    stu_id INT, 
    student_name VARCHAR(25), 
    course_name VARCHAR(25), 
    first_mark NUMERIC(2,0), 
    second_mark NUMERIC(2,0), 
    third_mark NUMERIC(2,0),
    CONSTRAINT pk_studentsmarks PRIMARY KEY (stu_id),
    CONSTRAINT fk_studentsmarks_course FOREIGN KEY (course_name) REFERENCES course (course_name)
);

这是来自 INNODB STATUS。

LATEST FOREIGN KEY ERROR
------------------------
130603 20:17:22 Error in foreign key constraint of table testdb/students_marks:
 FOREIGN KEY (course_name) REFERENCES course (course_name)
):
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html
for correct foreign key definition.

【问题讨论】:

  • 您得到的确切错误信息是什么?

标签: mysql mariadb


【解决方案1】:

您的课程表中的主键设置为 cou_idcourse_name。要在 students_marks 表中添加外键约束,您必须引用这两个字段(并在表定义中包含这两个字段):

CREATE TABLE IF NOT EXISTS course
(
    cou_id VARCHAR(3),
    course_name VARCHAR(25),
    CONSTRAINT pk_course PRIMARY KEY (cou_id, course_name)
);

CREATE TABLE IF NOT EXISTS students_marks
(
    stu_id INT, 
    student_name VARCHAR(25), 
    cou_id VARCHAR(3),
    course_name VARCHAR(25), 
    first_mark NUMERIC(2,0), 
    second_mark NUMERIC(2,0), 
    third_mark NUMERIC(2,0),
    CONSTRAINT pk_studentsmarks PRIMARY KEY (stu_id),
    CONSTRAINT fk_studentsmarks_course FOREIGN KEY (cou_id,course_name) REFERENCES course(cou_id,course_name)
);

【讨论】:

  • 我不断收到错误消息,即使我从 SQL Fiddle 复制和粘贴工作示例也是如此。但是代码在 SQL Fiddle 中有效。有什么想法吗?
  • @doc -- 您是否在 student_marks 的表定义中包含了 cou_id?它在本地为我工作,在小提琴上也是如此。
  • 是的,我已将您的示例从 sx 复制到我的 sql 脚本中。而且它也适用于 sql fiddle 但不适用于我的系统......很奇怪。但是,如果我用外键删除最后一行,一切正常。
  • 确保引用和外键列类型完全相同。即使是 int(21) 和 int(15) 的区别也可能会失败。
【解决方案2】:

您只引用了组合主键的一个字段!

【讨论】:

    猜你喜欢
    • 2020-08-07
    • 2014-12-16
    • 2011-06-06
    • 2011-02-17
    • 2017-04-09
    • 2016-10-12
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    相关资源
    最近更新 更多