1

magentoの新しいテーブルを作成しようとしていますが、既存のmagentoテーブルを参照しようとしています。私がググったものから、私が得ている問題は2つの問題のうちの1つである可能性があります。

  1. FKにはインデックスが必要です
  2. FKが参照する前にPKが存在している必要があります

どちらの場合も、私はこれらの両方を正しく行ったと思います。以下は既存のテーブルスキーマです

参照されている既存のテーブル

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で、user_idという列を持つadmin_userというテーブルが実際にあることがわかりました。store_idという列を持つcore_storeテーブルがあります。両方の列にINDEXESが作成されています。

誰かが問題が多分何であるかについて何か手がかりを持っていますか?以下は私のエラーメッセージです

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

3 に答える 3

3

外部キーとそれに対応する親キーのデータ型が同じである必要があります。データ型は、テーブル内の外部キーとその参照親キーとは異なります。そのため、エラーが発生します。

created byuserid親テーブルで中整数である間、intは符号なしです

同じことが2番目の外部キーの問題です

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

于 2013-01-23T14:17:34.777 に答える
3

外部キーを定義するときは、データ型が同じである必要があります。

として定義core_store.store_idsmallint(5) unsignedているため、参照列は同じである必要がありますoro_dashboard.default_store_id

また行うoro_dashboard.created_by

最後oro_dashboardのCREATETABLEクエリ、

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 
) 
于 2013-01-23T14:20:45.570 に答える
2

の列定義がとdefault_store_id一致していないようcore_store.store_idです。smallint(5) unsignedそれはあなたのテーブルにあるはずです。created_byテーブルの作成を妨げなかったものの、同じ問題があります

于 2013-01-23T14:19:33.903 に答える