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
;
我正在尝试使用外键添加表格,我收到此错误,为什么会发生这种情况?
user_details->ClientID
和profilePic->ClientID
上添加相同的详细信息
3.i已经有一个表调用`d userdb,在这个表中我有ClientID及其外键及其工作。 答案 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)