【问题标题】:Foreign key constraint is incorrectly formed in the table "Issues"表“问题”中的外键约束格式不正确
【发布时间】:2021-03-15 19:21:43
【问题描述】:

这是我创建的两个表,但在表issues 中出现错误:

我已经搜索了互联网,但无法找到任何解决方案。你能帮帮我吗?

CREATE TABLE Issues
(
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(100),
    description TEXT,
    type VARCHAR(50),
    priority VARCHAR(50),
    status VARCHAR(50),
    assigned_to INT,
    created_by INT,
    created DATETIME,
    updated DATETIME,

    FOREIGN KEY (assigned_to, created_by) REFERENCES Users(id, id)
) ENGINE=InnoDB;

CREATE TABLE Users
(
    id INT AUTO_INCREMENT PRIMARY KEY,
    firstname VARCHAR(30),
    lastname VARCHAR(30),
    password VARCHAR(30),
    email VARCHAR(30),
    date_joined DATETIME
) ENGINE=InnoDB;

【问题讨论】:

  • 最有可能的是,您只需要先创建Users - 在Issues 之前 - 以便可以设置 FK 约束并引用 existing 表...。
  • @marc_s,我也试过了......但我仍然收到错误:第 13 行的错误 1822 (HY000):无法添加外键约束。引用表 'Users' 中的约束 'Issues_ibfk_1' 缺少索引
  • 你真的要创建一个复合外键吗? Users 中没有匹配的复合主键 .... 或者您是否要为 assigned_toUsers.id 创建一个 FK 并为 created_by 创建另一个 FK 约束 - 再次到 Users.id - 分别? -----> 看@GMB 的回答——他一定读懂了我的想法并把它变成了一个答案;-)

标签: mysql sql database-design foreign-keys create-table


【解决方案1】:

您需要两个外键,而不是一个 - 您需要在子表之前创建父表:

-- parent table
create table users (
    id int auto_increment primary key,
    firstname varchar(30),
    lastname varchar(30),
    password varchar(30),
    email varchar(30),
    date_joined datetime
) engine=innodb;

-- child table
create table issues (
    id int auto_increment primary key,
    title varchar(100),
    description text,
    type varchar(50),
    priority varchar(50),
    status varchar(50),
    assigned_to int,
    created_by int,
    created datetime,
    updated datetime,
    foreign key (assigned_to) references users(id),  -- first FK
    foreign key (created_by)  references users(id)   -- second FK
) engine=innodb;

【讨论】:

  • 详细说明:为了在 InnoDB 中创建外键,您需要以完全相同的顺序引用索引。您没有索引(id, id),只有一个索引id,因此您需要使用2 个单独的FK 来引用它。请参阅MySQL doc on FKs
猜你喜欢
  • 2014-11-20
  • 1970-01-01
  • 2021-11-07
  • 2018-09-04
  • 2017-10-03
  • 2019-07-25
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
相关资源
最近更新 更多