Mysql 如何使用复合外键创建表

Mysql 如何使用复合外键创建表,mysql,foreign-keys,foreign-key-relationship,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` in

我用复合主键创建了主表

父表结构如下所示:

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`)
);
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;
当我试图用上面的父表引用创建带有外键的表时,我得到了“无法创建表错误no 150”错误。帮我做那件事

子表结构如下所示:

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`)
);
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;

请帮助我解决此问题。

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

来自:

InnoDB需要外键和引用键的索引,以便 外键检查可以很快,不需要扫描表。在 引用表时,必须有外键所在的索引 列按相同顺序列为第一列。这样的 如果没有索引,则会在引用表上自动创建索引 存在。如果您创建了索引,则稍后可能会自动删除该索引 可用于强制外键约束的另一个索引。 索引名称(如果给定)如前所述使用

因此,当您在父表中添加索引时,它会工作(是的,我测试了它):


这些列上已经有了主键(这意味着有一个隐式索引),但是列的顺序很重要

如果列是外键,那么您不需要在列上建立索引。@niraj nawanit-我也尝试过不使用索引,但得到了相同的错误。。这不会产生错误,任何关系在MyISAM中都会被忽略。此外,如果您使用linux,您可能必须遵守区分大小写的原则