【问题标题】:MySQL foreign keys on self自我上的MySQL外键
【发布时间】:2011-08-29 12:35:37
【问题描述】:

我目前正在尝试在 MySQL 中创建一个自引用表,但是我似乎无法在表本身上创建外键,我收到了 MySQL 错误:

Error Code: 1005. Can't create table 'biological classification' (errno: 150)

这是我的代码:

# Table creation
DROP TABLE IF EXISTS `biological classification`;
CREATE TABLE `biological classification` (
  `idBC` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `idParent` int(11) DEFAULT NULL,
  `type` varchar(45) DEFAULT NULL,
  `value` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`idBC`),
  UNIQUE KEY `idnew_table_UNIQUE` (`idBC`),
  CONSTRAINT `SelfKey` FOREIGN KEY (`idParent`) REFERENCES `biological classification` (`idBC`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=latin1 COMMENT='A table that contains the Biological Classification of anima';

# insert into table
INSERT INTO `biological classification` (`idBC`,`idParent`,`type`,`value`) VALUES (1,NULL,'Class','Mammalia');
INSERT INTO `biological classification` (`idBC`,`idParent`,`type`,`value`) VALUES (2,1,'Genus','Giraffa');
INSERT INTO `biological classification` (`idBC`,`idParent`,`type`,`value`) VALUES (3,2,'Species','Giraffa camelopardalis');
INSERT INTO `biological classification` (`idBC`,`idParent`,`type`,`value`) VALUES (5,1,'Genus','Panthera');
INSERT INTO `biological classification` (`idBC`,`idParent`,`type`,`value`) VALUES (6,1,'Genus','Loxodonta');
INSERT INTO `biological classification` (`idBC`,`idParent`,`type`,`value`) VALUES (7,5,'Species','Panthera leo');
INSERT INTO `biological classification` (`idBC`,`idParent`,`type`,`value`) VALUES (8,5,'Species','Panthera tigris');
INSERT INTO `biological classification` (`idBC`,`idParent`,`type`,`value`) VALUES (9,6,'Species','Loxodonta africana');
INSERT INTO `biological classification` (`idBC`,`idParent`,`type`,`value`) VALUES (10,1,'Class','Marsupialia');
INSERT INTO `biological classification` (`idBC`,`idParent`,`type`,`value`) VALUES (11,10,'Genus','Macropus');
INSERT INTO `biological classification` (`idBC`,`idParent`,`type`,`value`) VALUES (12,11,'Species','Macropus rufus');
INSERT INTO `biological classification` (`idBC`,`idParent`,`type`,`value`) VALUES (13,1,'Genus','Sarcophilus');
INSERT INTO `biological classification` (`idBC`,`idParent`,`type`,`value`) VALUES (14,13,'Species','Sarcophilus harrisii');
INSERT INTO `biological classification` (`idBC`,`idParent`,`type`,`value`) VALUES (15,10,'Genus','Didelphis');
INSERT INTO `biological classification` (`idBC`,`idParent`,`type`,`value`) VALUES (16,15,'Species','Didelphis virginiana');
INSERT INTO `biological classification` (`idBC`,`idParent`,`type`,`value`) VALUES (17,NULL,'Class','Aves');
INSERT INTO `biological classification` (`idBC`,`idParent`,`type`,`value`) VALUES (18,17,'Genus','Aquila');
INSERT INTO `biological classification` (`idBC`,`idParent`,`type`,`value`) VALUES (19,18,'Species','Aquila chrysaetos');

【问题讨论】:

    标签: mysql foreign-keys self-reference


    【解决方案1】:

    将类型从列idParent 更改为int(10) unsigned。所以和引用的列idBC是同一类型。

    DROP TABLE IF EXISTS `biological classification`;
    CREATE TABLE `biological classification` (
      `idBC` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `idParent` int(10) unsigned DEFAULT NULL,
      `type` varchar(45) DEFAULT NULL,
      `value` varchar(45) DEFAULT NULL,
      PRIMARY KEY (`idBC`),
      UNIQUE KEY `idnew_table_UNIQUE` (`idBC`),
      CONSTRAINT `SelfKey` FOREIGN KEY (`idParent`) REFERENCES `biological classification` (`idBC`) ON DELETE NO ACTION ON UPDATE NO ACTION
    ) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=latin1 COMMENT='A table that contains the Biological Classification of anima';
    

    【讨论】:

    • 我知道这已经很老了,但对于谷歌人来说:我也遇到过类似的情况。我有几个表,它们都有 id 字段 int(11)。它们中的任何一个都没有“未签名”,所以它们都是相似的。但是,mysql 拒绝创建自引用表。其他已创建。阅读此页面后,我将未签名添加到所有这些,然后一切正常。我认为尽管所有 id 字段完全相同,但如果您将其中一些字段设为“自动增量”,它们可能会被接受为“未签名”。可能这对我来说是个问题。谢谢。
    【解决方案2】:

    你到底为什么要在表名中放一个空格???

    使用下划线而不是空格将其命名为 biological_classification

    然后让两列使用相同的数据类型,要么都使用int(10),要么都使用int(11),并让它们都使用signed,或者都使用unsigned(已编辑)。

    【讨论】:

    • 需要排队的不是int(10)或者int(11),是有符号和无符号的。
    • 因为我还没有了解到在表名中放置空格是不好的做法,你能解释一下为什么吗? - 请保持冷静,我是 MySQL 新手。
    • @Skeen 这是关于可读性和舒适性的一般良好实践。在名称中使用空格时,您通常必须处理括号和其他事情,这使得它通常比实际情况更复杂。避免标识符中的空格是一种普遍的良好做法,不仅适用于 SQL。
    猜你喜欢
    • 2015-01-26
    • 2011-04-06
    • 2011-07-01
    • 2012-05-06
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 2013-08-28
    相关资源
    最近更新 更多