2014-11-23 69 views
0

我尝试使用下面的SQL添加一些表格,数据库,问题是它创建的第一个表,而是抛出一个错误:MySQL的外键和表不与错误号创建105

[Err] 1005 - Can't create table 'BigBlockStudios_woodcraft.sbb_categories' (errno: 150) 

当我尝试运行它。

SET FOREIGN_KEY_CHECKS=0; 

-- ---------------------------- 
-- Table structure for `sbb_catalog` 
-- ---------------------------- 
DROP TABLE IF EXISTS `sbb_catalog`; 
CREATE TABLE `sbb_catalog` (
    `id` int(8) unsigned NOT NULL AUTO_INCREMENT, 
    `sku` varchar(50) NOT NULL, 
    `category` int(8) NOT NULL, 
    `type` int(8) NOT NULL, 
    `make` int(8) NOT NULL, 
    `model` int(8) NOT NULL, 
    `year` int(8) NOT NULL, 
    PRIMARY KEY (`id`), 
    INDEX (`category`,`type`,`make`,`model`,`year`), 
    FOREIGN KEY (`category`) REFERENCES sbb_categories(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
    FOREIGN KEY (`type`) REFERENCES sbb_type(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
    FOREIGN KEY (`make`) REFERENCES sbb_make(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
    FOREIGN KEY (`model`) REFERENCES sbb_model(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
    FOREIGN KEY (`year`) REFERENCES sbb_year(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

-- ---------------------------- 
-- Table structure for `sbb_categories` 
-- ---------------------------- 
DROP TABLE IF EXISTS `sbb_categories`; 
CREATE TABLE `sbb_categories` (
    `id` int(8) unsigned NOT NULL AUTO_INCREMENT, 
    `category` varchar(50) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; 

-- ---------------------------- 
-- Table structure for `sbb_makes` 
-- ---------------------------- 
DROP TABLE IF EXISTS `sbb_makes`; 
CREATE TABLE `sbb_makes` (
    `id` int(8) unsigned NOT NULL AUTO_INCREMENT, 
    `make` varchar(50) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; 

-- ---------------------------- 
-- Table structure for `sbb_models` 
-- ---------------------------- 
DROP TABLE IF EXISTS `sbb_models`; 
CREATE TABLE `sbb_models` (
    `id` int(8) unsigned NOT NULL AUTO_INCREMENT, 
    `model` varchar(50) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; 

-- ---------------------------- 
-- Table structure for `sbb_vehicle_types` 
-- ---------------------------- 
DROP TABLE IF EXISTS `sbb_vehicle_types`; 
CREATE TABLE `sbb_vehicle_types` (
    `id` int(8) unsigned NOT NULL AUTO_INCREMENT, 
    `type` varchar(50) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; 

-- ---------------------------- 
-- Table structure for `sbb_years` 
-- ---------------------------- 
DROP TABLE IF EXISTS `sbb_years`; 
CREATE TABLE `sbb_years` (
    `id` int(8) unsigned NOT NULL AUTO_INCREMENT, 
    `year` decimal(4,0) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; 

我第一次尝试创建与关系构建InnoDB表[努力学习一些谊]

我在做什么错在这里?

+0

也许使类别无符号? – 2014-11-23 21:33:12

+1

你有几个unsigned缺少,你引用一个缺少的表(sbb_type),表的顺序是错误的,你正在创建外键到尚未创建的表,还引用表名称在他们的单数http: //sqlfiddle.com/#!2/689104 – Mihai 2014-11-23 21:35:11

+1

SQL Fiddle在第一个表上产生一个错误,因为没有定义外键引用表。当使用'drop table if exists'时可能会遇到所有问题,并且您有现有的表结构错误。 – 2014-11-23 21:35:55

回答

1

我敢肯定,原因是idsbb_categoriescategory,sbb_catalog之间的数据类型不匹配。从前者中删除unsigned或将其添加到后者。 对于所有其他外键引用也是如此。

由于@Mihai在评论你也有不匹配的名字中指出 - 这显然需要例如要这么改:

FOREIGN KEY (`type`) REFERENCES sbb_type(`id`) 

应改为

FOREIGN KEY (`type`) REFERENCES sbb_types(`id`) 

进行这些更改会使其正常工作(至少在SQL Fiddle

+0

谢谢!是的,它似乎确实是这些东西的组合。 – 2014-11-23 21:57:06