2013-01-23 119 views
1

我想创建一个新的magento表,我试图引用现有的magento表。从我搜索的内容来看,我得到的问题可能是两个问题中的一个。#1005 - 无法创建表errno:150 Magento

  1. 的FK必须有一个指数
  2. 的PK必须存在之前,FK可以引用

在这两种情况下,我相信我做了这两种正确。下面是现有的表架构

已有TABLES被引用

CREATE TABLE IF NOT EXISTS `core_store` (
    `store_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, 
    `code` varchar(32) NOT NULL DEFAULT '', 
    `website_id` smallint(5) unsigned DEFAULT '0', 
    `group_id` smallint(5) unsigned NOT NULL DEFAULT '0', 
    `name` varchar(255) NOT NULL, 
    `sort_order` smallint(5) unsigned NOT NULL DEFAULT '0', 
    `is_active` tinyint(1) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`store_id`), 
    UNIQUE KEY `code` (`code`), 
    KEY `FK_STORE_WEBSITE` (`website_id`), 
    KEY `is_active` (`is_active`,`sort_order`), 
    KEY `FK_STORE_GROUP` (`group_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Stores' AUTO_INCREMENT=9 ; 


CREATE TABLE IF NOT EXISTS `admin_user` (
    `user_id` mediumint(9) unsigned NOT NULL AUTO_INCREMENT, 
    `firstname` varchar(32) NOT NULL DEFAULT '', 
    `lastname` varchar(32) NOT NULL DEFAULT '', 
    `email` varchar(128) NOT NULL DEFAULT '', 
    `username` varchar(40) NOT NULL DEFAULT '', 
    `password` varchar(100) NOT NULL DEFAULT '', 
    `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `modified` datetime DEFAULT NULL, 
    `logdate` datetime DEFAULT NULL, 
    `lognum` smallint(5) unsigned NOT NULL DEFAULT '0', 
    `reload_acl_flag` tinyint(1) NOT NULL DEFAULT '0', 
    `is_active` tinyint(1) NOT NULL DEFAULT '1', 
    `extra` text, 
    `failures_num` smallint(6) NOT NULL DEFAULT '0', 
    `first_failure` datetime DEFAULT NULL, 
    `lock_expires` datetime DEFAULT NULL, 
    PRIMARY KEY (`user_id`), 
    UNIQUE KEY `UNQ_ADMIN_USER_USERNAME` (`username`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Users' AUTO_INCREMENT=25 ; 

表我想创建

CREATE TABLE `oro_dashboard` 
(`id` int unsigned NOT NULL, 
`name` varchar(255) NOT NULL default '', 
`description` varchar(64) NOT NULL default '', 
`created_by` int unsigned NOT NULL default '0', 
`created_at` date, 
`layout` varchar(255) NOT NULL default '', 
`default_store_id` int, 
PRIMARY KEY (`id`), 
KEY `IDX_ORO_DASHBOARD_CREATED_BY` (`created_by`), 
CONSTRAINT `FK_ORO_DASHBOARD_CREATED_BY_ADMIN_USER_USER_ID` FOREIGN KEY (`created_by`) REFERENCES `admin_user` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE, 
CONSTRAINT `FK_ORO_DASHBOARD_DEFAULT_STORE_ID_CORE_STORE_STORE_ID` FOREIGN KEY (`default_store_id`) REFERENCES `core_store` (`store_id`) ON DELETE SET NULL ON UPDATE CASCADE) 
ENGINE=INNODB charset=utf8 COLLATE=utf8_unicode_ci 

在Magento,我发现有在行动表称为admin_user确实有一个名为user_id的列。有一个core_store表,它有一个名为store_id的列。并且我的两列都有INDEXES。

有没有人有任何线索可能是什么问题?以下是我的错误信息

#1005 - Can't create table 'db.oro_dashboard' (errno: 150) 

回答

2

似乎为default_store_id列定义不匹配core_store.store_id 。它应该在你的表中为smallint(5) unsignedcreated_by也有同样的问题,但它并不妨碍表的创建

3

定义外键时,数据类型必须相同。

您正在将core_store.store_id定义为smallint(5) unsigned,因此引用列必须相同:oro_dashboard.default_store_id

也不要放弃oro_dashboard.created_by

最终oro_dashboard CREATE TABLE查询,

CREATE TABLE `oro_dashboard` 
(`id` int unsigned NOT NULL, 
`name` varchar(255) NOT NULL default '', 
`description` varchar(64) NOT NULL default '', 
`created_by` mediumint(9) unsigned NOT NULL default '0', 
`created_at` date, 
`layout` varchar(255) NOT NULL default '', 
`default_store_id` smallint(5) unsigned, 
PRIMARY KEY (`id`), 
KEY `IDX_ORO_DASHBOARD_CREATED_BY` (`created_by`) , 
CONSTRAINT `FK_ORO_DASHBOARD_CREATED_BY_ADMIN_USER_USER_ID` 
    FOREIGN KEY (`created_by`) 
    REFERENCES `admin_user` (`user_id`) 
    ON DELETE CASCADE ON UPDATE CASCADE, 
CONSTRAINT `FK_ORO_DASHBOARD_DEFAULT_STORE_ID_CORE_STORE_STORE_ID` 
    FOREIGN KEY (`default_store_id`) 
    REFERENCES `core_store` (`store_id`) 
    ON DELETE SET NULL ON UPDATE CASCADE 
) 
相关问题