0

所以我在过去的两天里几乎都查过了,我似乎无法弄清楚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 (album) REFERENCES Album(id),即没有预先设置约束。

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

4

5 回答 5

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' 使用'Album' 名称而不是Album 创建一个表,使用'id' 和'name' 字段而不是id 和名称等

于 2013-06-28T11:21:47.693 回答
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;
于 2013-06-28T11:18:27.083 回答
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;

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

于 2013-06-28T11:11:55.357 回答
1

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

于 2013-06-28T11:25:53.240 回答
1

我可以建议您使用 MySQL Workbench。它是免费的,而且很容易 dislogs 指导您完成此类过程。

这对我有用,看看它对你有什么作用。我只是更改了字段名称albumalbumId使列的使用更加明显。

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;
于 2013-06-28T11:27:26.373 回答