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