2

我正在为我的在线作品集网站在 MySQL 中编写一个数据库,以对我为客户/项目所做的所有设计/作品进行分类,我这样做是为了更容易添加新作品,而不必手动编辑标记.

无论如何,我尝试运行以下脚本:

create table album (
   AlbumID int not null,
   AlbumOrder int not null,
   AlbumName varchar(100),
   primary key (AlbumID, AlbumOrder)
);

create table category (
   CategoryID int not null primary key auto_increment,
   CategoryName varchar(100)
);

create table item (
   ItemID int not null primary key auto_increment,
   CategoryID int not null,
   AlbumID int not null,
   AlbumOrder int not null,
   ItemName varchar(100),
   Description varchar(500),
   ThumbPath varchar(100),
   PhotoPath varchar(100),
   InsertDate datetime,
   EditDate datetime,
   constraint fk_catID foreign key (CategoryID) references category (CategoryID) on update cascade,
   constraint fk_albID foreign key (AlbumID) references album (AlbumID) on update cascade,
   constraint fk_albOrd foreign key (AlbumOrder) references album (AlbumOrder) on update cascade
);

我收到 1005 错误,说无法创建项目表。我不知道问题出在哪里,但我相信这真的很明显!

编辑:使用的引擎是 innoDB。

4

3 回答 3

0

您的陈述没有任何问题,因为它们现在存在。

我刚刚在我的测试 mysql 环境中成功执行了它们。但是,我的环境可能与您的不同:我的默认引擎是 InnoDB,您的可能是其他引擎。

由于您使用的是外键约束,因此您应该明确指定引擎是 InnoDB ("...) engine = Innodb")。

也可能是因为您已经有一个或多个表存在。在每次创建之前使用 DROP... IF EXISTS,它应该可以正常工作。

于 2013-07-03T12:59:21.973 回答
0

show engine innodb status通过在收到错误后立即运行 MySQL 语句,您可以检索有关错误的更多详细信息(输出缩短):

LATEST FOREIGN KEY ERROR

Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.

在被引用的表中,必须有一个索引,其中被引用的列被列为第一列。这对 无效fk_albOrd foreign key (AlbumOrder)

要解决此问题,您可以向表AlbumOrder上的列添加索引,Album或者 - 最好 - 摆脱约束fk_albOrd并将fk_albID约束更改为 Derek Kromm 建议的一组列:

constraint fk_albID foreign key (AlbumID, AlbumOrder) references album (AlbumID, AlbumOrder) on update cascade
于 2013-07-03T14:04:50.910 回答
0

看起来您对专辑的 fks 可能会导致问题。您应该有一个基于 2 列的 FK,而不是 2 个基于 1 列的 FK,如下所示(删除 fk_albOrd 行):

constraint fk_albID foreign key (AlbumID,AlbumOrder) references album (AlbumID,AlbumOrder) on update cascade

此脚本在SQL Fiddle中创建没有错误的表:

create table album (
   AlbumID int not null,
   AlbumOrder int not null,
   AlbumName varchar(100),
   primary key (AlbumID, AlbumOrder)
);

create table category (
   CategoryID int not null primary key auto_increment,
   CategoryName varchar(100)
);

create table item (
   ItemID int not null primary key auto_increment,
   CategoryID int not null,
   AlbumID int not null,
   AlbumOrder int not null,
   ItemName varchar(100),
   Description varchar(500),
   ThumbPath varchar(100),
   PhotoPath varchar(100),
   InsertDate datetime,
   EditDate datetime,
   constraint fk_catID foreign key (CategoryID) references category (CategoryID) on update cascade,
   constraint fk_albID foreign key (AlbumID,AlbumOrder) references album (AlbumID,AlbumOrder) on update cascade

);
于 2013-07-03T12:58:29.257 回答