2010-10-26 12 views
1

L'idée est assez simple: j'ai trois (ou plus) tablesMySQL clé étrangère à une autre clé étrangère

- master_tbl (id, something, somethingelse) 
- tbl2 (id, ....) 
- tbl3 (id, ....) 

Maintenant, ce que je veux une relation clé étrangère, comme tbl3.id citerais TBL2 .id et tbl2.id pointent vers master_tbl.id - toutes les clés étrangères sont ON UPDATE CASCADE et ON DELETE CASCADE. Ce que je vais obtenir de ceci est que quand je supprime un enregistrement de tbl2, son équivalent tbl3 sera également effacé, mais pas master_tbl. Lorsque je supprime un enregistrement de master_tbl, les trois tables sont effacées.

Lorsque j'essaie de créer la clé étrangère sur tbl3.id-> tbl2.id, j'obtiens une erreur mysql 150 - impossible de créer une table (le tbl2.id-> master_tbl.id est déjà créé). Ma version de MySQL est 5.1.46. Des idées pour lesquelles cela pourrait être?

EDIT: définitions de table smf_members aka master_table

-- Table "smf_members" DDL 

CREATE TABLE `smf_members` (
    `id_member` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, 
    `member_name` varchar(80) NOT NULL DEFAULT '', 
    `date_registered` int(10) unsigned NOT NULL DEFAULT '0', 
    `posts` mediumint(8) unsigned NOT NULL DEFAULT '0', 
    `id_group` smallint(5) unsigned NOT NULL DEFAULT '0', 
    `lngfile` varchar(255) NOT NULL DEFAULT '', 
    `last_login` int(10) unsigned NOT NULL DEFAULT '0', 
    `real_name` varchar(255) NOT NULL DEFAULT '', 
    `instant_messages` smallint(5) NOT NULL DEFAULT '0', 
    `unread_messages` smallint(5) NOT NULL DEFAULT '0', 
    `new_pm` tinyint(3) unsigned NOT NULL DEFAULT '0', 
    `buddy_list` text NOT NULL, 
    `pm_ignore_list` varchar(255) NOT NULL DEFAULT '', 
    `pm_prefs` mediumint(8) NOT NULL DEFAULT '0', 
    `mod_prefs` varchar(20) NOT NULL DEFAULT '', 
    `message_labels` text NOT NULL, 
    `passwd` varchar(64) NOT NULL DEFAULT '', 
    `openid_uri` text NOT NULL, 
    `email_address` varchar(255) NOT NULL DEFAULT '', 
    `personal_text` varchar(255) NOT NULL DEFAULT '', 
    `gender` tinyint(4) unsigned NOT NULL DEFAULT '0', 
    `birthdate` date NOT NULL DEFAULT '0001-01-01', 
    `website_title` varchar(255) NOT NULL DEFAULT '', 
    `website_url` varchar(255) NOT NULL DEFAULT '', 
    `location` varchar(255) NOT NULL DEFAULT '', 
    `icq` varchar(255) NOT NULL DEFAULT '', 
    `aim` varchar(255) NOT NULL DEFAULT '', 
    `yim` varchar(32) NOT NULL DEFAULT '', 
    `msn` varchar(255) NOT NULL DEFAULT '', 
    `hide_email` tinyint(4) NOT NULL DEFAULT '0', 
    `show_online` tinyint(4) NOT NULL DEFAULT '1', 
    `time_format` varchar(80) NOT NULL DEFAULT '', 
    `signature` text NOT NULL, 
    `time_offset` float NOT NULL DEFAULT '0', 
    `avatar` varchar(255) NOT NULL DEFAULT '', 
    `pm_email_notify` tinyint(4) NOT NULL DEFAULT '0', 
    `karma_bad` smallint(5) unsigned NOT NULL DEFAULT '0', 
    `karma_good` smallint(5) unsigned NOT NULL DEFAULT '0', 
    `usertitle` varchar(255) NOT NULL DEFAULT '', 
    `notify_announcements` tinyint(4) NOT NULL DEFAULT '1', 
    `notify_regularity` tinyint(4) NOT NULL DEFAULT '1', 
    `notify_send_body` tinyint(4) NOT NULL DEFAULT '0', 
    `notify_types` tinyint(4) NOT NULL DEFAULT '2', 
    `member_ip` varchar(255) NOT NULL DEFAULT '', 
    `member_ip2` varchar(255) NOT NULL DEFAULT '', 
    `secret_question` varchar(255) NOT NULL DEFAULT '', 
    `secret_answer` varchar(64) NOT NULL DEFAULT '', 
    `id_theme` tinyint(4) unsigned NOT NULL DEFAULT '0', 
    `is_activated` tinyint(3) unsigned NOT NULL DEFAULT '1', 
    `validation_code` varchar(10) NOT NULL DEFAULT '', 
    `id_msg_last_visit` int(10) unsigned NOT NULL DEFAULT '0', 
    `additional_groups` varchar(255) NOT NULL DEFAULT '', 
    `smiley_set` varchar(48) NOT NULL DEFAULT '', 
    `id_post_group` smallint(5) unsigned NOT NULL DEFAULT '0', 
    `total_time_logged_in` int(10) unsigned NOT NULL DEFAULT '0', 
    `password_salt` varchar(255) NOT NULL DEFAULT '', 
    `ignore_boards` text NOT NULL, 
    `warning` tinyint(4) NOT NULL DEFAULT '0', 
    `passwd_flood` varchar(12) NOT NULL DEFAULT '', 
    `pm_receive_from` tinyint(4) unsigned NOT NULL DEFAULT '1', 
    PRIMARY KEY (`id_member`), 
    KEY `member_name` (`member_name`), 
    KEY `real_name` (`real_name`), 
    KEY `date_registered` (`date_registered`), 
    KEY `id_group` (`id_group`), 
    KEY `birthdate` (`birthdate`), 
    KEY `posts` (`posts`), 
    KEY `last_login` (`last_login`), 
    KEY `lngfile` (`lngfile`(30)), 
    KEY `id_post_group` (`id_post_group`), 
    KEY `warning` (`warning`), 
    KEY `total_time_logged_in` (`total_time_logged_in`), 
    KEY `id_theme` (`id_theme`) 
) ENGINE=InnoDB AUTO_INCREMENT=73 DEFAULT CHARSET=utf8; 

cyp_users aka TBL2

-- Table "cyp_users" DDL 

CREATE TABLE `cyp_users` (
    `id` mediumint(8) unsigned NOT NULL, 
    `role` varchar(255) NOT NULL DEFAULT 'unregistered', 
    PRIMARY KEY (`id`), 
    CONSTRAINT `cyp_users_ibfk_1` FOREIGN KEY (`id`) REFERENCES `smf_members` (`id_member`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

cyp_vip_users aka TBL3

-- Table "cyp_vip_users" DDL 

CREATE TABLE `cyp_vip_users` (
    `id` mediumint(8) NOT NULL, 
    `od` date NOT NULL, 
    `do` date NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
+0

S'il vous plaît poster le script que vous utilisez. Ce que vous essayez de faire est une exigence de base pour * tout * serveur de base de données. L'erreur doit être dans votre script. –

+0

J'essaye de faire ceci par le client de Navicat MySQL, mais j'affiche au moins les définitions de table. – cypher

+0

Il n'y a pas de clé étrangère de tbl3 à tbl2. Je suppose que vous avez oublié de poster cette partie. –

Répondre

0

Le ID's de tbl2 et tbl3 sont des types différents.
Les clés étrangères doivent être du même type.

  • tbl2.ID est UNSIGNED
  • tbl3.ID est SIGNED