在浏览了数十个论坛帖子和我的本地SQL书籍后,我遇到了一个奇怪的问题,我无法解决。
我有两个表,想向其中一个表添加一个外键。外键和主键共享相同的数据类型和字符集,但我根本无法添加外键。
addon_account
name | type | 注释 |
---|---|---|
id | 整数(11) | 主键 |
名称 | 瓦尔查尔(60) | 主键 |
标签 | 瓦尔查尔(255) | |
共享 | 国际(11) |
您正在addon_account_data(account_name)
上创建引用addon_account(name)
的外键。您有一个引用表的复合主表:addon_account(id, name)
。
这在 MySQL 中是不允许的,如文档中所述:
MySQL需要外键和引用键的索引,以便外键检查可以快速并且不需要表扫描。在引用表中,必须有一个索引,其中外键列按相同顺序作为第一列列出。
可能的解决方案:
-
在引用表中添加一个附加列:
addon_account_data(account_id, account_name)
并为addon_account
中的相应列创建复合主键 -
在
addon_account(name)
上创建索引(可能是最简单的解决方案) -
更改引用表的主键中列的顺序,例如:
addon_account(name, id)
(您可能首先要考虑这可能对性能产生的影响)
我不完全是一个MySQL人,但是:
我相信问题是你只引用了主键的一部分: 您的表addon_account有一个组合键 PK(id、名称)。
因此,要使您的关系正常工作,您还需要添加"account_id"作为外键的一部分:
ALTER TABLE addon_account_data ADD FOREIGN KEY (account_id, account_name) REFERENCES addon_account(id, name)
此线程处理类似内容。
我希望这有所帮助。
编辑
我已经在本地计算机上安装了MySQL服务器实例...(MySQL 8)。
我已经运行了下面的脚本,它起作用了(给出关于整数显示是一个不推荐使用的功能的警告,所以我建议省略它):
CREATE TABLE addon_account(
id INT(11) NOT NULL,
`name` VARCHAR(60) NOT NULL,
label VARCHAR(255),
shared INT(11),
CONSTRAINT pk_addon_account PRIMARY KEY(id, `name`));
CREATE TABLE addon_account_data (
id INT(11) NOT NULL,
account_name VARCHAR(60) NOT NULL,
account_id INT(11),
money DOUBLE,
`owner` VARCHAR(255),
CONSTRAINT pk_addon_account_data PRIMARY KEY(id, account_name),
CONSTRAINT fk_addon_account_account_data FOREIGN KEY(account_id, account_name)
REFERENCES addon_account(id, `name`));
你能试试看,看看这是否适合你吗?
我对MySQL不是那么熟悉。
确保2 个表具有相同的排序规则 喜欢 COLLATE='utf8_general_ci'