0

在浏览了几十个论坛帖子和我的本地 SQL 书籍后,我遇到了一个我无法解决的奇怪问题。

我有两张桌子,想给其中一张添加外键。外键和主键共享相同的数据类型和字符集,但我根本无法添加外键。

addon_account

姓名 类型 评论
ID 整数(11) 首要的关键
姓名 varchar(60) 首要的关键
标签 varchar(255)
共享 整数(11)

addon_account_data

姓名 类型 评论
ID 整数(11) 首要的关键
帐户名称 varchar(60) 首要的关键
双倍的
所有者 varchar()

我运行的查询:

ALTER TABLE `addon_account_data` ADD FOREIGN KEY (`account_name`) REFERENCES `addon_account`(`name`) ON DELETE RESTRICT ON UPDATE RESTRICT;

无法让它工作。一直在抛出同样的问题。

4

3 回答 3

0

我不完全是 MySQL 人,但是:

我认为问题在于您仅引用了主键的一部分:您的表 addon_account 具有复合键 PK(id, name)。

因此,为了让您的关系发挥作用,您还需要添加“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 不是很熟悉。

于 2019-10-22T19:47:21.437 回答
0

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)您可能需要首先考虑这可能对性能产生的影响)

于 2019-10-22T20:51:47.880 回答
0

确保 2 个表具有相同的排序规则,例如 COLLATE='utf8_general_ci'

于 2020-10-28T13:10:12.943 回答