为啥我在尝试创建此表时不断收到外键错误? [复制]
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
表中同时包含id
和category_id
实际上很令人困惑。我怀疑那里存在设计错误。)
【讨论】:
我认为可以使用非主键作为外键,只要它是这个答案中所述的唯一字段***.com/questions/8118739/… @IvánQuiñones:是吗?有趣的。我怀疑 RDBMS 可能会有所不同。对我来说似乎不直观,但我想它可能有它的用途。 应该,唯一字段符合唯一性(双关语)需要指向一个且只有一个元素,索引的原则 在 MySQL 中,只需要对引用的列进行索引。但是 - 如果它不是 UNIQUE 和 NOT NULL,则行为可能是不可预测的。 @IvánQuiñones:同意。只要某些东西是唯一的,那么在语义上它就应该能够识别一条记录。尽管在这种特殊情况下,我仍然怀疑同时拥有categories.id
和 categories.category_id
可能是一个设计错误,并且可能会导致数据模型进一步混乱。以上是关于为啥我在尝试创建此表时不断收到外键错误? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥我在不使用 get 方法时不断收到“The GET method...”? [复制]
为啥我在尝试设置 PayPal 付款时在生产中不断收到 INVALID_RESOURCE_ID 错误?
为啥在 phpmyadmin 中创建此表会生成 #1064 错误?
尝试将 python 字典列表转换为 SQLite 表时,我不断收到错误消息?