mysql 无法建立外键约束,关于索引:MySQL无法创建外键约束

我在为mysql数据库中的现有表创建外键时遇到一些问题。

我有表exp:

+-------------+------------------+------+-----+---------+-------+

| Field       | Type             | Null | Key | Default | Extra |

+-------------+------------------+------+-----+---------+-------+

| EID         | varchar(45)      | NO   | PRI | NULL    |       |

| Comment     | text             | YES  |     | NULL    |       |

| Initials    | varchar(255)     | NO   |     | NULL    |       |

| ExpDate     | date             | NO   |     | NULL    |       |

| InsertDate  | date             | NO   |     | NULL    |       |

| inserted_by | int(11) unsigned | YES  | MUL | NULL    |       |

+-------------+------------------+------+-----+---------+-------+

而且我不想使用以下内容创建一个新的表sample_df引用此表:

但是我得到了错误:

ERROR 1215 (HY000): Cannot add foreign key constraint

为了获得更多信息,我做了:

从中我得到:

对我来说,列类型似乎是匹配的,因为它们都是varchar(45)。(我还尝试将experiment列设置为非null,但这并不能解决问题),所以我猜问题一定是。 但是我不太确定这意味着什么,或者如何检查/修复它。 有没有人有什么建议? first columns是什么意思?

在任何答案或问题中,我都找不到因字符集不同而发生此错误的地方。 谢谢。。干杯!

另外,请仔细检查您的列排序规则。 您的表可以是utf8mb4,但列可以具有不同的排序规则!

只是将其混入可能的原因中,当引用表列具有相同的"类型"但没有相同的签名时,我就遇到了这种情况。

在我的情况下,被引用的表列是TINYINT UNSIGNED,而我的引用表列是TINYINT SIGNED。对齐两列即可解决此问题。

@ austen-hoogen建议的解决方案已解决我的问题。 但是由于信誉评分低,我无法对其解决方案进行投票和评论。 在我的情况下,主键是整数,自动递增和无符号。 但是外键(引用表的列)是带符号的类型。 我将其更改为未签名,并能够成功创建关系。

是的,经历了同样的问题。 我的主键是BIGINT(20),而我在另一个表中引用的键是INT(10)无符号。 我们要确保它们都匹配。 即。 BIGINT(20),并且在引用表中也应为BIGINT(20)

根据http://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html

MySQL requires indexes on foreign keys and referenced keys so that

foreign key checks can be fast and not require a table scan. In the

referencing table, there must be an index where the foreign key

columns are listed as the first columns in the same order.

InnoDB permits a foreign key to reference any index column or group of

columns. However, in the referenced table, there must be an index

where the referenced columns are listed as the first columns in the

same order.

因此,如果存在引用表中的索引并且该索引由几列组成,并且所需的列不在第一列,则将发生错误。

我们的错误原因是由于违反以下规则:

Corresponding columns in the foreign key and the referenced key must

have similar data types. The size and sign of integer types must be

the same. The length of string types need not be the same. For

nonbinary (character) string columns, the character set and collation

must be the same.

如果引用表和当前表的字符集不同,也会发生此错误。

如@Anton所述,这可能是因为数据类型不同。

在我的情况下,我有主键BIGINT(20)并尝试使用INT(10)设置四键

谢谢! 我在INT(11)和INT(11)中使用INT(11)时遇到了类似的问题,但其中一个是主键,因此未签名,而另一个已签名!

就我而言,事实证明所引用的列未声明为主或唯一的。

https://stackoverflow.com/a/18435114/1763217

我的是在引用表和要创建的表之间的排序规则问题,因此我必须显式设置我正在引用的键的排序规则类型。

首先,我在引用表上运行查询以获取其归类类型

show table STATUS like '';

然后,我复制了排序规则类型,并在创建查询中明确声明了employee_id的排序规则类型。在我的情况下是utf8_general_ci

CREATE TABLE dbo.sample_db

(

id INT PRIMARY KEY AUTO_INCREMENT,

event_id INT SIGNED NOT NULL,

employee_id varchar(45) COLLATE utf8_general_ci NOT NULL,

event_date_time DATETIME,

CONSTRAINT sample_db_event_event_id_fk FOREIGN KEY (event_id) REFERENCES event (event_id),

CONSTRAINT sample_db_employee_employee_id_fk FOREIGN KEY (employee_id) REFERENCES employee (employee_id)

);

主键的确切顺序也需要匹配,中间没有多余的列。

我有一个主键设置,其中的列顺序实际上匹配,但是问题是主键中有一个额外的列,该列不属于引用表的外键

例如)表2,列(a,b,c)->表1,列(a,b,d,c)-此失败

我必须对主键列进行重新排序,以便不仅以相同的方式对其进行排序,而且中间没有多余的列:

例如)表2(a,b,c)列->表1(a,b,c,d)列-此成功

在某些情况下,除了将其定义为主键之外,我还必须使引用的字段唯一。

但是我发现不将其定义为唯一并不会在每种情况下造成问题。我还无法弄清楚情况。可能与可为空的定义有关。

您是否已阅读FK简介或手册? FK引用UNIQUE; PK表示UNIQUE NOT NULL。

我也有这个错误。没有一个答案与我有关。就我而言,我的GUI自动创建一个表,该表的主要唯一标识符为" unssigned"。当我尝试创建外键并给我完全相同的错误时,此操作将失败。我的主键需要分配。

如果您像这样写SQL本身id int unique auto_increment,那么就不会出现此问题,但是由于某种原因,我的GUI却会这样做,而不是id int unassigned unique auto_increment。

希望这可以帮助其他人。

在同一约束中多次引用同一列也会产生此Cannot find an index in the referenced table错误,但可能很难在大型表上发现。拆分约束,它将按预期工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值