为啥我在尝试创建此表时不断收到外键错误? [复制]

Posted

技术标签:

【中文标题】为啥我在尝试创建此表时不断收到外键错误? [复制]【英文标题】:Why do I keep getting foreign key errors when trying to create this table? [duplicate]为什么我在尝试创建此表时不断收到外键错误? [复制] 【发布时间】:2019-07-10 15:00:12 【问题描述】:

我正在尝试为数据库创建表。一切都很好,除了当我尝试创建最后一个连接表时,它一直给我一个外键错误“使用外键约束创建表'refactor_test/ads_categories'失败。引用的列出现的引用表中没有索引作为第一列。”

这是我用来创建每个表的参数,不断抛出错误的是 ads_categories:

    create table ads
    (
      id          int unsigned not null auto_increment,
      user_id     int unsigned not null,
      title       varchar(100) not null,
      description varchar(500),
      primary key (id),
      foreign key (user_id) references refactor_test.users (id)
    );

    create table users
    (
      id       int unsigned not null auto_increment,
      username varchar(25)  not null,
      password varchar(100) not null,
      email    varchar(40)  not null,
      primary key (id)
    );

    create table categories
    (
      id          int unsigned auto_increment not null,
      category    varchar(50)                 not null,
      category_id int unsigned                not null,
      primary key (id)
    );

    create table ads_categories
    (
      id          int unsigned auto_increment not null,
      ad_id       int unsigned                not null,
      ad_category int unsigned                not null,
      primary key (id),
      foreign key (ad_id) references refactor_test.ads (id),
      foreign key (ad_category) references refactor_test.categories (category_id)
    );

【问题讨论】:

来自docs:“此外,出于性能原因,mysql 要求对引用的列进行索引。但是,系统不强制要求引用的列必须是唯一的或声明为 NOT NULL。对于 UPDATE 或 DELETE CASCADE 等操作,对非唯一键或包含 NULL 值的键的外键引用的处理没有明确定义。建议您使用仅引用 UNIQUE(包括 PRIMARY)和 NOT NULL 键的外键。" 【参考方案1】:

可能是因为 categories.category_id 不是类别表的键,也不是唯一字段

【讨论】:

【参考方案2】:

外键链接到目标表的主键。在这里,您尝试链接到 categories 表上的 category_id

foreign key (ad_category) references refactor_test.categories (category_id)

但这不是该表的主键。 id 是:

foreign key (ad_category) references refactor_test.categories (id)

(在categories 表中同时包含idcategory_id 实际上很令人困惑。我怀疑那里存在设计错误。)

【讨论】:

我认为可以使用非主键作为外键,只要它是这个答案中所述的唯一字段***.com/questions/8118739/… @IvánQuiñones:是吗?有趣的。我怀疑 RDBMS 可能会有所不同。对我来说似乎不直观,但我想它可能有它的用途。 应该,唯一字段符合唯一性(双关语)需要指向一个且只有一个元素,索引的原则 在 MySQL 中,只需要对引用的列进行索引。但是 - 如果它不是 UNIQUE 和 NOT NULL,则行为可能是不可预测的。 @IvánQuiñones:同意。只要某些东西是唯一的,那么在语义上它就应该能够识别一条记录。尽管在这种特殊情况下,我仍然怀疑同时拥有 categories.idcategories.category_id可能是一个设计错误,并且可能会导致数据模型进一步混乱。

以上是关于为啥我在尝试创建此表时不断收到外键错误? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在不使用 get 方法时不断收到“The GET method...”? [复制]

为啥我在尝试设置 PayPal 付款时在生产中不断收到 INVALID_RESOURCE_ID 错误?

为啥在 phpmyadmin 中创建此表会生成 #1064 错误?

尝试将 python 字典列表转换为 SQLite 表时,我不断收到错误消息?

为啥我在 FluentValidation MustAsync 中收到 CS1061 错误

在 kivy 样式文件中使用尖括号时,为啥我不断收到“无效语法”错误?