为什么mySql不允许我声明外键?

为什么mySql不允许我声明外键?,mysql,sql,database-design,foreign-keys,syntax-error,Mysql,Sql,Database Design,Foreign Keys,Syntax Error,所以我在过去的两天里几乎都在查找它,我似乎不知道是什么原因导致mysql不允许我添加外键。当我运行包含外键的第二个表的代码时,我得到以下错误: 1072-表中不存在键列“album” 我很确定我的代码中没有任何语法错误,因为我已经修改过几次了 我以前在Stakoff看到过同样的问题,但是这些问题的问题是非常明显的语法错误,但是这些问题的解决方案中没有一个与我的问题相关,没有一个解决了我的问题 下面是我正在运行的代码,上面返回的错误。提前谢谢 CREATE TABLE ‘Album’(

所以我在过去的两天里几乎都在查找它,我似乎不知道是什么原因导致mysql不允许我添加外键。当我运行包含外键的第二个表的代码时,我得到以下错误:

1072-表中不存在键列“album”

我很确定我的代码中没有任何语法错误,因为我已经修改过几次了

我以前在Stakoff看到过同样的问题,但是这些问题的问题是非常明显的语法错误,但是这些问题的解决方案中没有一个与我的问题相关,没有一个解决了我的问题

下面是我正在运行的代码,上面返回的错误。提前谢谢

    CREATE TABLE ‘Album’(
    ‘id’ INT AUTO_INCREMENT PRIMARY KEY ,
    ‘name’ VARCHAR( 35 ) NOT NULL 
    ) ENGINE = InnoDB;
上面的代码运行没有问题,但是当我运行下面的代码时,会出现错误

    CREATE TABLE ‘Picture’(
    ‘id_pk’ INT AUTO_INCREMENT PRIMARY KEY ,
    ‘album’ INT,
    ‘pictureURL’ VARCHAR( 270 ) NOT NULL ,
    ‘name’ VARCHAR( 35 ) NOT NULL ,
    CONSTRAINT album_fk FOREIGN KEY ( album ) REFERENCES Album( id ) 
  ) ENGINE = InnoDB;
我已经摆弄了约束行,并且它也是以外键album REFERENCES Albumid的形式出现的,也就是说,前面没有约束


谢谢大家,毕竟有一个语法错误,就像一些人说的,这和有趣的引语有关,删除它们,就像一个符咒。非常感谢

据我所知,外键应该是索引,以使它们成为外键

我在mysql开发文档中找到了这个例子


我不确定,但您可以尝试相应地修改代码。

我认为您应该在将“album”列声明为外键之前为其编制索引 请检查这是否有效

CREATE TABLE ‘Picture’(
    ‘id_pk’ INT AUTO_INCREMENT PRIMARY KEY ,
    ‘album’ INT,
    ‘pictureURL’ VARCHAR( 270 ) NOT NULL ,
    ‘name’ VARCHAR( 35 ) NOT NULL ,
     INDEX (album),
    CONSTRAINT album_fk FOREIGN KEY ( album ) REFERENCES Album( id ) 
  ) ENGINE = InnoDB;

首先,您不需要任何引号,因为使用了任何保留字

我尝试在不使用引号的情况下执行这些sql查询,结果非常成功

    CREATE TABLE Album(
id INT AUTO_INCREMENT PRIMARY KEY ,
name VARCHAR( 35 ) NOT NULL 
) ENGINE = InnoDB;


CREATE TABLE Picture(
id_pk INT AUTO_INCREMENT PRIMARY KEY ,
album INT,
pictureURL VARCHAR( 270 ) NOT NULL ,
name VARCHAR( 35 ) NOT NULL ,
CONSTRAINT album_fk FOREIGN KEY ( album ) REFERENCES Album( id ) 
) ENGINE = InnoDB;
创建表“相册”
创建一个表,使用“Album”名称而不是Album,使用“id”和“name”字段而不是id和名称等等。您似乎使用了有趣的引号,这些引号成为名称的一部分。删除它们,您应该会很好

我建议您使用MysQL Workbench。它是免费的,也很简单,它可以引导你完成这一过程

这对我有用,看看它对你有什么用。我只是将字段名album更改为albumId,以使列的使用更加明显

CREATE  TABLE `Picture` (
`id` INT NOT NULL AUTO_INCREMENT ,
`albumId` INT NULL ,
`pictureURL` VARCHAR(270) NOT NULL ,
`name` VARCHAR(35) NOT NULL ,
PRIMARY KEY (`id`) ,
INDEX `album_fk_idx` (`albumId` ASC) ,
CONSTRAINT `album_fk` FOREIGN KEY (`albumId` ) REFERENCES `album` (`id` ) ON DELETE NO ACTION ON UPDATE NO ACTION)
ENGINE = InnoDB;

可能'album'INT引用了Albumid,?如果删除所有引号会发生什么?如果你不使用任何保留字,就不需要它们。请删除花哨的引号“相册”。如有必要,请不使用任何内容或反引号:`Album`索引可以更快地检查引用完整性。如果索引不存在,MySQL会在创建外键约束时自动添加索引。明确地添加它是很好的,这样您就可以选择索引的名称,但它与OP的问题无关。是的,确实与引号有关,我不知道为什么,但它是有效的。谢谢。谢谢你的建议,我会看看Workbench,但现在看来它是通过删除引号来工作的。谢谢你提到索引功能,我现在肯定会把它作为参考。是的,我是出于一些奇怪的原因使用一些有趣的引号,我不知道为什么,但这是我从\旁边的键得到的。谢谢
CREATE  TABLE `Picture` (
`id` INT NOT NULL AUTO_INCREMENT ,
`albumId` INT NULL ,
`pictureURL` VARCHAR(270) NOT NULL ,
`name` VARCHAR(35) NOT NULL ,
PRIMARY KEY (`id`) ,
INDEX `album_fk_idx` (`albumId` ASC) ,
CONSTRAINT `album_fk` FOREIGN KEY (`albumId` ) REFERENCES `album` (`id` ) ON DELETE NO ACTION ON UPDATE NO ACTION)
ENGINE = InnoDB;