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

时间:2013-06-28 11:03:28

标签: mysql sql database-design foreign-keys syntax-error

所以我在过去两天几乎查了一下,我似乎无法弄清楚mysql是什么让我不添加外键。当我运行包含外键的第二个表的代码时,我收到以下错误:

#1072 - 表

中不存在关键列“专辑”

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

我之前在stakOVF中看过同样的问题,但这些问题的问题是非常明显的语法错误,但是这些问题的解决方案并不是我的问题所解决的,没有一个解决了我的问题。

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

    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;

我摆弄了CONSTRAINT系列,并且我还使用以下形式FOREIGN KEY(专辑)REFERENCES Album(id),它没有前置约束。

谢谢大家,毕竟有一个语法错误,就像有人说这是有趣的引用,删除它们,就像一个魅力。非常感谢!

5 个答案:

答案 0 :(得分:3)

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

我尝试在没有引号的情况下执行这些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;

CREATE TABLE'Album' 创建一个包含“相册”名称而不是相册的表格,其中包含“id”和“name”字段,而不是id和name等等

答案 1 :(得分:2)

我认为你应该将列'专辑'编入索引,然后再将其声明为外键 请检查一下是否有效

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;

答案 2 :(得分:1)

据我所知,外键应该是索引才能真正使它们成为外键。

我在mysql开发文档(http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html

中找到了这个例子
CREATE TABLE parent (
    id INT NOT NULL,
    PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE child (
    id INT, 
    parent_id INT,
    INDEX par_ind (parent_id),
    FOREIGN KEY (parent_id) 
        REFERENCES parent(id)
        ON DELETE CASCADE
) ENGINE=INNODB;

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

答案 3 :(得分:1)

您似乎使用有趣的引号,它们成为名称的一部分。删除它们你应该没问题

答案 4 :(得分:1)

我可以建议您掌握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;