使用SQL脚本在mySQL中找不到表

使用SQL脚本在mySQL中找不到表,mysql,sql,foreign-keys,relational-database,Mysql,Sql,Foreign Keys,Relational Database,我正在写一个mySQL脚本来创建一个关于音乐家和乐队的数据库。许多音乐家可以在一个乐队和许多乐队有一个流派。我成功地创建了第一个名为Musiners的表,其属性为Musiner_name和band_name,band_name作为主键。现在,我尝试创建第二个名为bands的表,它将具有band_名称和流派属性,使用band_名称作为主键,也作为引用Mustiers表中band_名称的外键。当我在MySQL命令行客户端中运行脚本时,脚本将显示第一个表,但随后我收到多行错误,它们都说“ERROR 1

我正在写一个mySQL脚本来创建一个关于音乐家和乐队的数据库。许多音乐家可以在一个乐队和许多乐队有一个流派。我成功地创建了第一个名为Musiners的表,其属性为Musiner_name和band_name,band_name作为主键。现在,我尝试创建第二个名为bands的表,它将具有band_名称和流派属性,使用band_名称作为主键,也作为引用Mustiers表中band_名称的外键。当我在MySQL命令行客户端中运行脚本时,脚本将显示第一个表,但随后我收到多行错误,它们都说“ERROR 1146(42S02):表'tours.bands'不存在”。我在引用表之前创建了引用表,两个表中的band_name的两种数据类型都相同,并且band_name包含的值都是唯一的,所以我不确定我做错了什么

以下是我的SQL脚本:

DROP DATABASE IF EXISTS tours;
CREATE DATABASE tours;
USE tours;

CREATE TABLE musicians(
    musician_name varchar(30),
    band_name varchar(30),
    PRIMARY KEY(musician_name)
);

CREATE TABLE bands(
    band_name varchar(30),
    genre varchar(30),
    PRIMARY KEY (band_name),
    FOREIGN KEY (band_name) REFERENCES musicians(band_name)
);

INSERT INTO musicians (musician_name, band_name) VALUES ('Robinson', 'Purple Death');
INSERT INTO musicians (musician_name, band_name) VALUES ('Harvey', 'Purple Death');
INSERT INTO musicians (musician_name, band_name) VALUES ('Jackson', 'Purple Death');
INSERT INTO musicians (musician_name, band_name) VALUES ('Lynne', 'Megapain');
INSERT INTO musicians (musician_name, band_name) VALUES ('Perry', 'Megapain');
INSERT INTO musicians (musician_name, band_name) VALUES ('Hook', 'Megapain');
INSERT INTO musicians (musician_name, band_name) VALUES ('Matthews', 'Old Strawberry');
INSERT INTO musicians (musician_name, band_name) VALUES ('Lowden', 'Old Strawberry');
INSERT INTO musicians (musician_name, band_name) VALUES ('Bowyer', 'Old Strawberry');
INSERT INTO musicians (musician_name, band_name) VALUES ('Mills', 'Bakers Dozen');
INSERT INTO musicians (musician_name, band_name) VALUES ('Watson', 'Bakers Dozen');
INSERT INTO musicians (musician_name, band_name) VALUES ('Weston', 'Sarabelle Weston');
INSERT INTO musicians (musician_name, band_name) VALUES ('D Smith', 'Dimity Smith');
INSERT INTO musicians (musician_name, band_name) VALUES ('A Smith', 'Dimity Smith');
INSERT INTO musicians (musician_name, band_name) VALUES ('Atkins', 'Old Storm Town');
INSERT INTO musicians (musician_name, band_name) VALUES ('Ambrose', 'Old Storm Town');
INSERT INTO musicians (musician_name, band_name) VALUES ('Jones', 'Old Storm Town');
INSERT INTO musicians (musician_name, band_name) VALUES ('Williams', 'Horizons');
INSERT INTO musicians (musician_name, band_name) VALUES ('Moore', 'Horizons');
INSERT INTO musicians (musician_name, band_name) VALUES ('Tyler', 'Horizons');

SELECT * FROM musicians;

INSERT INTO bands (band_name, genre) VALUES ('Purple Death', 'Heavy Metal'); 
INSERT INTO bands (band_name, genre) VALUES ('Megapain', 'Heavy Metal'); 
INSERT INTO bands (band_name, genre) VALUES ('Old Strawberry', 'Folk'); 
INSERT INTO bands (band_name, genre) VALUES ('Bakers Dozen', 'Folk'); 
INSERT INTO bands (band_name, genre) VALUES ('Sarabelle Weston', 'Country and Western'); 
INSERT INTO bands (band_name, genre) VALUES ('Dimity Smith', 'Country and Western'); 
INSERT INTO bands (band_name, genre) VALUES ('Old Storm Town', 'Rock'); 
INSERT INTO bands (band_name, genre) VALUES ('Horizons', 'Rock'); 

SELECT * FROM bands;
表格条带应如下所示:

Bands          |  Genre
Purple Death   | Heavy Metal
Megapain       | Heavy Metal
Old Strawberry | Folk
Bakers Dozen   | Folk
等等

如果您能提供帮助,解释为什么这个表不会显示,为什么mySQL认为这个表不存在,我们将不胜感激!谢谢


编辑:我发现问题实际上与引用表上缺少索引有关

我想你的外键放错桌子了。试试这个

CREATE TABLE bands(
    band_name varchar(30),
    genre varchar(30),
    PRIMARY KEY (band_name)    
);


CREATE TABLE musicians(
    musician_name varchar(30),
    band_name varchar(30),
    PRIMARY KEY(musician_name),
    FOREIGN KEY (band_name) REFERENCES bands(band_name)
);

INSERT INTO bands (band_name, genre) VALUES ('Purple Death', 'Heavy Metal'); 
INSERT INTO bands (band_name, genre) VALUES ('Megapain', 'Heavy Metal'); 
INSERT INTO bands (band_name, genre) VALUES ('Old Strawberry', 'Folk'); 
INSERT INTO bands (band_name, genre) VALUES ('Bakers Dozen', 'Folk'); 
INSERT INTO bands (band_name, genre) VALUES ('Sarabelle Weston', 'Country and Western'); 
INSERT INTO bands (band_name, genre) VALUES ('Dimity Smith', 'Country and Western'); 
INSERT INTO bands (band_name, genre) VALUES ('Old Storm Town', 'Rock'); 
INSERT INTO bands (band_name, genre) VALUES ('Horizons', 'Rock'); 

INSERT INTO musicians (musician_name, band_name) VALUES ('Robinson', 'Purple Death');
INSERT INTO musicians (musician_name, band_name) VALUES ('Harvey', 'Purple Death');
INSERT INTO musicians (musician_name, band_name) VALUES ('Jackson', 'Purple Death');
INSERT INTO musicians (musician_name, band_name) VALUES ('Lynne', 'Megapain');
INSERT INTO musicians (musician_name, band_name) VALUES ('Perry', 'Megapain');
INSERT INTO musicians (musician_name, band_name) VALUES ('Hook', 'Megapain');
INSERT INTO musicians (musician_name, band_name) VALUES ('Matthews', 'Old Strawberry');
INSERT INTO musicians (musician_name, band_name) VALUES ('Lowden', 'Old Strawberry');
INSERT INTO musicians (musician_name, band_name) VALUES ('Bowyer', 'Old Strawberry');
INSERT INTO musicians (musician_name, band_name) VALUES ('Mills', 'Bakers Dozen');
INSERT INTO musicians (musician_name, band_name) VALUES ('Watson', 'Bakers Dozen');
INSERT INTO musicians (musician_name, band_name) VALUES ('Weston', 'Sarabelle Weston');
INSERT INTO musicians (musician_name, band_name) VALUES ('D Smith', 'Dimity Smith');
INSERT INTO musicians (musician_name, band_name) VALUES ('A Smith', 'Dimity Smith');
INSERT INTO musicians (musician_name, band_name) VALUES ('Atkins', 'Old Storm Town');
INSERT INTO musicians (musician_name, band_name) VALUES ('Ambrose', 'Old Storm Town');
INSERT INTO musicians (musician_name, band_name) VALUES ('Jones', 'Old Storm Town');
INSERT INTO musicians (musician_name, band_name) VALUES ('Williams', 'Horizons');
INSERT INTO musicians (musician_name, band_name) VALUES ('Moore', 'Horizons');
INSERT INTO musicians (musician_name, band_name) VALUES ('Tyler', 'Horizons');

您需要FK引用的列上的索引。您的第一个表定义应该是

CREATE TABLE musicians(
    musician_name varchar(30),
    band_name varchar(30),
    PRIMARY KEY(musician_name),
    INDEX (band_name)
);
Pro提示:运行SQL语句时,必须查看错误消息,尤其是数据定义语句。不看错误信息就像闭着眼睛开车一样。如果有的话,效果很差

当我运行你的数据定义语句时,我得到了这个

SQL错误(1005):无法创建表
带区
(错误号:150“外键约束格式不正确”)


出现错误的原因很可能是没有创建表格标注栏。列出数据库中的所有表:
显示表
,然后仅运行用于创建
波段
表的部分(如果它实际上不在那里)并向我们显示错误(如果有)。然后我们可以试着帮忙。我已经看完了你的脚本,一切都很顺利。@JarekJóźwik在删除bands表并再次创建它之后,我遇到了一个错误:错误1215(HY000):无法添加外键约束。使用“SHOW ENGINE INNODB STATUS;”我发现:表巡更/波段的外键约束出错:外键(波段名称)引用(波段名称)):在引用的表中找不到引用列作为第一列出现的索引,或者表中的列类型与引用的表中的约束不匹配。我仍然不确定我做错了什么我试过了,它只是翻转了结果,只有bands表会出现啊,我想当使用外键时,它会创建索引,我没有意识到我也必须为它做一个。所以经过一些研究,看起来你需要使用InnoDB storange引擎来自动创建索引的外键,但是当我检查哪个存储引擎是我的默认引擎时,它说InnoDB。。。奇怪的