如何使用复合外键创建表

时间:2012-09-01 07:45:16

标签: mysql foreign-keys foreign-key-relationship

我使用复合主键创建了主表。

父表结构如下:

CREATE TABLE `taskcategory` (
  `SiteID` int(10) unsigned NOT NULL DEFAULT 1,
  `TaskID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `TaskName` varchar(45) DEFAULT '',
  `TaskDescription` varchar(45) DEFAULT '',
  `IsInbuild` int(11) DEFAULT '1',
  PRIMARY KEY (`TaskID`,`SiteID`)
);

当我尝试使用上述父表引用创建具有外键的表时,我得到'无法创建表错误没有150'错误。帮助我做到这一点。

子表结构如下:

CREATE TABLE taskdetails (`SiteID` int(10) unsigned NOT NULL DEFAULT '1',
  `TaskID` int(10) unsigned NOT NULL DEFAULT '0',
  `SubtaskID` int(10) unsigned NOT NULL,
  `ScriptName` varchar(255) DEFAULT '',
  `FunctionName` varchar(255) DEFAULT '',
  `ButtonName` varchar(255) DEFAULT '',
  `IsInbuild` int(10) unsigned DEFAULT '1',
  `Description` varchar(255) DEFAULT '',
  PRIMARY KEY (`SubtaskID`,`TaskID`,`SiteID`),
                            INDEX (siteid, taskid),
                            FOREIGN KEY (siteid, taskid)
                              REFERENCES taskcategory(siteid, taskid)
                              ON UPDATE CASCADE ON DELETE CASCADE
                            ) ENGINE=INNODB;

帮我解决。

2 个答案:

答案 0 :(得分:1)

来自manual

  

InnoDB需要外键和引用键的索引   外键检查可以很快,不需要表扫描。在里面   引用表时,必须有一个索引所在的外键   列以相同顺序列为第一列。这样的   如果不是,则会自动在引用表上创建索引   存在。如果您创建,可能会稍后以静默方式删除此索引   另一个可用于强制执行外键约束的索引。   如果给定,则使用index_name,如前所述。

因此,当您在父表中添加索引时,它可以正常工作(是的,我测试过它):

CREATE TABLE `taskcategory` (
  `SiteID` int(10) unsigned NOT NULL DEFAULT 1,
  `TaskID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `TaskName` varchar(45) DEFAULT '',
  `TaskDescription` varchar(45) DEFAULT '',
  `IsInbuild` int(11) DEFAULT '1',
  PRIMARY KEY (`TaskID`,`SiteID`)
  , INDEX (SiteID, TaskID)
) ENGINE=INNODB;

CREATE TABLE taskdetails (`SiteID` int(10) unsigned NOT NULL DEFAULT '1',
  `TaskID` int(10) unsigned NOT NULL DEFAULT '0',
  `SubtaskID` int(10) unsigned NOT NULL,
  `ScriptName` varchar(255) DEFAULT '',
  `FunctionName` varchar(255) DEFAULT '',
  `ButtonName` varchar(255) DEFAULT '',
  `IsInbuild` int(10) unsigned DEFAULT '1',
  `Description` varchar(255) DEFAULT '',
  PRIMARY KEY (`SubtaskID`,`TaskID`,`SiteID`)
                            ,INDEX (SiteID, TaskID)
                            ,FOREIGN KEY (SiteID, TaskID)
                              REFERENCES taskcategory(SiteID, TaskID)
                              ON UPDATE CASCADE ON DELETE CASCADE
                            ) ENGINE=INNODB;

您已经在这些列上拥有主键(这意味着存在隐式索引),但列的顺序非常重要

答案 1 :(得分:0)

taskcategory的表定义缺少ENGINE = InnoDB子句,可能这不是系统的默认值。外键关系只能在InnoDB表之间建立。