SQL错误(1215):无法添加外键约束

时间:2016-09-05 13:21:37

标签: mysql database heidisql

CREATE TABLE `profilePic` (
    `ClientID` VARCHAR(255) NOT NULL,
    PRIMARY KEY (`ClientID`),
    CONSTRAINT `FK__user_details` FOREIGN KEY (`ClientID`) REFERENCES `user_details` (`ClientID`) ON UPDATE CASCADE ON DELETE CASCADE
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB
;

我正在尝试使用外键添加表格,我收到此错误,为什么会发生这种情况?

  1. 尝试做新表。
  2. 我想在user_details->ClientIDprofilePic->ClientID上添加相同的详细信息 3.i已经有一个表调用`d userdb,在这个表中我有ClientID及其外键及其工作。

2 个答案:

答案 0 :(得分:3)

以下内容将失败,因为排序规则不同。为什么我这样说?因为OP没有。

注意:由于使用该排序规则调整varchar 255的大小,然后使用自动选择的字符集,因缩小1071而缩小了大小。

关键是,如果整理不同,它就不会起作用。

CREATE TABLE `user_details` (
    `ClientID` VARCHAR(100) NOT NULL,
    PRIMARY KEY (`ClientID`)
)ENGINE=InnoDB;

CREATE TABLE `profilePic` (
    `ClientID` VARCHAR(100) NOT NULL,
    PRIMARY KEY (`ClientID`),
    CONSTRAINT `FK__user_details` FOREIGN KEY (`ClientID`) REFERENCES `user_details` (`ClientID`) ON UPDATE CASCADE ON DELETE CASCADE
)COLLATE='utf8mb4_unicode_ci' ENGINE=InnoDB;

上述失败是在表级别。可以看到一个更棘手的问题,即由于列级排序规则不匹配导致1215错误in This answer

将讨论拉到更一般的情况......

您是要尝试在创建表格时使用ALTER TABLE

建立外键约束
  

|添加[CONSTRAINT [symbol]]           FOREIGN KEY [index_name](index_col_name,...)           reference_definition

,例如

ALTER TABLE `facility` ADD CONSTRAINT `fkZipcode` 
     FOREIGN KEY (`zipcode`) REFERENCES `allzips`(`zipcode`);

以下内容适用。

来自名为Using FOREIGN KEY Constraints的MySQL手册页:

  

外键和引用键中的对应列必须   有类似的数据类型。整数类型的大小和符号必须是   相同。字符串类型的长度不必相同。对于   非二进制(字符)字符串列,字符集排序规则   必须是一样的。

此外,引用的(父)表必须具有最左侧的密钥才能进行快速查找(验证)。该父密钥不必是PRIMARY甚至是UNIQUE。这个概念在下面的第二个块中描述。如果必要,第一个块会提到 Helper 索引,如果需要,将在引用(子)表中创建。

  

MySQL要求外键和引用键上的索引   外键检查可以很快,不需要表扫描。在里面   引用表时,必须有一个索引所在的外键   列以相同顺序列为第一列。这样的   如果不是,则会自动在引用表上创建索引   存在。如果您创建,可能会稍后以静默方式删除此索引   另一个可用于强制执行外键约束的索引。   如果给定,则使用index_name,如前所述。

     

InnoDB允许外键引用任何列或组   列。但是,在引用的表中,必须有一个索引   其中引用的列被列为的第一列   同样的顺序。

答案 1 :(得分:1)

尝试通过HeidiSQL创建外键时,只要所选列数据类型不匹配,就会收到警告。由于来自服务器的非直观消息(“无法添加外键约束”),我将此警告添加到HeidiSQL的表设计器中

  

所选外部列与源列数据类型和unsigned标志不匹配。尝试保存此更改时,这将给您一条错误消息。请比较一下自己:

Foreign key mismatch in HeidiSQL