#1005 - 无法创建表错误:150 Magento

时间:2013-01-23 14:08:19

标签: mysql sql magento

我正在尝试为magento创建一个新表,我正在尝试引用现有的magento表。从我用Google搜索,我得到的问题可能是2个问题中的一个。

  1. FK必须有索引
  2. PK必须在FK可以参考之前存在
  3. 在这两种情况下,我相信我都正确地做了这两件事。下面是现有的表模式

    现有的表已被引用

    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)
    

3 个答案:

答案 0 :(得分:3)

对于外键及其对应的父键,数据类型必须相同。数据类型与表中的外键及其引用父键不同,这就是它给出错误的原因。

created by是无符号的,而userid是父表中的中间int

同样是第二个外键中的问题

参考http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

答案 1 :(得分: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 
) 

答案 2 :(得分:2)

default_store_id的列定义似乎与core_store.store_id不匹配。它应该在你的表中smallint(5) unsignedcreated_by有同样的问题,虽然它不会阻止创建表