添加外键约束的规则[重复]

Posted

技术标签:

【中文标题】添加外键约束的规则[重复]【英文标题】:Rules to add the foreign key constraint [duplicate] 【发布时间】:2021-01-19 19:30:58 【问题描述】:

我正在学习数据库。我需要在mysql中创建这张图片中的表

这是我在 Jupyter 笔记本中的代码:

CREATE TABLE warehouse(
code VARCHAR(100) not null,
ISBN varchar(225),
number int,
address varchar(30),
phone varchar(20),
PRIMARY KEY(code)
);

CREATE TABLE book(
ISBN varchar(225),
title varchar(255),
year  decimal(4,0),
price decimal(10,2),
in_stock int,
in_basket int,
PRIMARY KEY(ISBN),
FOREIGN KEY (ISBN, in_stock) REFERENCES warehouse(ISBN, number)
);

CREATE TABLE shopping_basket(
basket_id varchar(40),
ISBN varchar(225),
number_in_basket int,
PRIMARY KEY(basket_id),
FOREIGN KEY (ISBN, number_in_basket) REFERENCES book(ISBN, in_basket)
 );

我的错误:

DatabaseError: (mysql.connector.errors.DatabaseError) 1822 (HY000): Failed to add the foreign key constraint. Missing index for constraint 'book_ibfk_1' in the referenced table 'warehouse'
[SQL: CREATE TABLE book(
    ISBN varchar(225),
    title varchar(255),
    year  decimal(4,0),
    price decimal(10,2),
    in_stock int,
    in_basket int,
    PRIMARY KEY(ISBN),
    UNIQUE KEY(in_stock),
    FOREIGN KEY (ISBN, in_stock) REFERENCES warehouse(ISBN, number)
    );]

现在我确定它们都具有相同类型的变量。 谁能帮我解决这个错误?我正在学习,所以我的理解有限 谢谢

【问题讨论】:

【参考方案1】:

所有 rfrenced 外键都需要一个索引,这是强制性的。

所以你的代码必须是这样的。

您使用的是组合外键,因此索引也必须组合

CREATE TABLE warehouse(
code VARCHAR(100) not null,
ISBN varchar(225),
number int,
address varchar(30),
phone varchar(20),
PRIMARY KEY(code),
KEY(ISBN, number)
);

CREATE TABLE book(
ISBN varchar(225),
title varchar(255),
year  decimal(4,0),
price decimal(10,2),
in_stock int,
in_basket int,
PRIMARY KEY(ISBN),
FOREIGN KEY (ISBN, in_stock) REFERENCES warehouse(ISBN, number),
KEY (ISBN, in_basket)
);

CREATE TABLE shopping_basket(
basket_id varchar(40),
ISBN varchar(225),
number_in_basket int,
PRIMARY KEY(basket_id),
FOREIGN KEY (ISBN, number_in_basket) REFERENCES book(ISBN, in_basket)
 );

【讨论】:

您的解决方案非常适合我。不过,如果你有一点时间。请问索引是什么意思?我知道一个表需要主键,但我不理解索引。 索引是一种结构(如平衡二叉树),用于快速查找引用的值,因为外键约束操作系统总是检查是否创建了相应的条目,索引使搜索更快。因此,所有外键都必须有一个索引,请参阅dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html,也请accept the answer

以上是关于添加外键约束的规则[重复]的主要内容,如果未能解决你的问题,请参考以下文章

(nuub)#1215 - 无法添加外键约束[重复]

MySql - 无法添加或更新子外键约束失败[重复]

如何修复“无法添加或更新子行:外键约束失败”[重复]

mysql中添加外键问题,求高手

mysql外键名重复的问题。

mysql表创建好后添加外键