2010-10-26 125 views
1

的想法很簡單:我有三個(或多個)表MySQL的外鍵到另一個外鍵

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

現在,我要的是一個外鍵關係,如tbl3.id將指向TBL2 .id和tbl2.id會指向master_tbl.id - 所有外鍵都是ON UPDATE CASCADEON DELETE CASCADE。我從中得到的是,當我從tbl2中刪除一條記錄時,它的tbl3等價物也會被擦除,但不是master_tbl。當我從master_tbl中刪除記錄時,所有三個表都被擦除。

當我嘗試在tbl3.id-> tbl2.id上創建外鍵時,出現mysql錯誤150 - 無法創建表(已創建tbl2.id-> master_tbl.id)。我的MySQL版本是5.1.46。任何想法,爲什麼這可能是?

編輯:表定義 smf_members又名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又名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又名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

請發表您使用的腳本。你所要做的是*任何*數據庫服務器的核心要求。該錯誤必須在腳本中。 – 2010-10-26 10:02:39

+0

我試圖通過Navicat MySQL客戶端來做到這一點,但我至少會發布表定義。 – cypher 2010-10-26 10:03:37

+0

從tbl3到tbl2沒有外鍵。我假設你忘了發佈該部分。 – 2010-10-26 10:10:03

回答

0

的的和tbl3是不同的類型。
外鍵需要是相同的類型。

  • tbl2.ID是UNSIGNED
  • tbl3.ID是SIGNED