2013-01-23 2 views
1

J'essaie de créer une nouvelle table pour magento et j'essaie de référencer les tables magento existantes. De ce que j'ai googlé, le problème que je reçois peut être l'un des 2 problèmes.# 1005 - Impossible de créer la table errno: 150 Magento

  1. Le FK doit avoir un indice
  2. Le PK doit être avant que le FK peut faire référence

Dans les deux cas, je crois que je l'ai fait ces deux correctement. Ci-dessous est des schémas de table existants

DÉJÀ EXISTANTS TABLES référencé

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 ; 

Tableau je suis en train de créer

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 

En magento, j'ai trouvé il y a dans les faits une table appelée admin_user qui n'a une colonne appelée user_id. Il existe une table core_store qui possède une colonne appelée store_id. et mes deux colonnes ont fait des INDEX.

Est-ce que quelqu'un a la moindre idée de ce que le problème peut-être? Ci-dessous est mon message d'erreur

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

Répondre

2

Il semble que la définition de la colonne pour default_store_id ne correspond pas à core_store.store_id . il devrait être smallint(5) unsigned dans votre tableau. created_by a le même problème, bien qu'il n'empêche pas la création de la table

3

Il est nécessaire que le type de données soit identique pour la clé étrangère et sa clé parent correspondante. Le type de données est différent de la clé étrangère et de sa clé parent de référence dans votre table, c'est pourquoi elle donne une erreur.

created by est un entier non signé en userid est moyenne int dans le tableau parent

même est un problème dans la deuxième clé étrangère

référence http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

3

Lors de la définition de clés étrangères, le type de données doit être le même.

Vous définissez core_store.store_id comme smallint(5) unsigned et la colonne de référence doit donc être la même: oro_dashboard.default_store_id.

Est-ce aussi avec oro_dashboard.created_by

final oro_dashboard requête 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 
) 
Questions connexes