mysql - 一个表的多个列引用同一个外键列

标签 mysql foreign-keys ddl

我有一个名为 subcategories 的表,其记录可以进一步链接到表中的其他记录。所以我创建了一个定义这些链接的 subcategorylinker 表。在此表中,我有 2 列子类别和 nextsubcategory,它们都引用子类别表的 id 字段。但是我在创建表时遇到错误。错误如下:

ERROR 1005: Can't create table 'test01.subcategorylinker' (errno: 150)

表定义如下:

CREATE  TABLE `test01`.`subcategorylinker` (    
  `id` INT NOT NULL ,            
  `subcategory` INT NOT NULL ,    
  `nextsubcategory` INT NOT NULL ,    
  PRIMARY KEY (`id`) ,    
  INDEX `fk_subcategorylinker_sub` (`subcategory` ASC, `nextsubcategory` ASC) ,    
  CONSTRAINT `fk_subcategorylinker_sub`    
    FOREIGN KEY (`subcategory` , `nextsubcategory` )    
    REFERENCES `test01`.`subcategories` (`id` , `id` )    
    ON DELETE NO ACTION    
    ON UPDATE NO ACTION);

最佳答案

让我们检查一下外键子句:

FOREIGN KEY (`subcategory` , `nextsubcategory` )

REFERENCES `test01`.`subcategories` (`id` , `id` )

这意味着表格中 (subcategory, nextsubcategroy) 的每个组合都应与表格中 (id, id) 的组合相匹配。由于没有 (id, id) 的组合,因为它是单个字段,所以该语句是非法的。

相反,您可以有两个外键,一个用于 subcategory,一个用于 nextsubcategory,每个都应匹配一个 id:

CREATE  TABLE `test01`.`subcategorylinker` (
  `id` INT NOT NULL ,
  `subcategory` INT NOT NULL ,
  `nextsubcategory` INT NOT NULL ,

  PRIMARY KEY (`id`) ,

  INDEX `fk_subcategorylinker_sub` (`subcategory` ASC),

  CONSTRAINT `fk_subcategorylinker_sub`
    FOREIGN KEY (`subcategory`)
    REFERENCES `test01`.`subcategories` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,

  INDEX `fk_nextsubcategorylinker_sub` (`nextsubcategory` ASC),

  CONSTRAINT `fk_nextsubcategorylinker_sub`
    FOREIGN KEY (`nextsubcategory`)
    REFERENCES `test01`.`subcategories` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION);

关于mysql - 一个表的多个列引用同一个外键列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25278713/

相关文章:

Mysql 选择在一列中具有相同值而在另一列中具有不同值的行

mysql - solr 查询与 mysql 完全相似

MySQL数据库创建,多个外键错误?

ruby-on-rails - Has_many、belongs_to 具有多个外键

php - php递归获取 child 的 child

php - 我应该在 PDO 事务中运行多个 SELECT 以提高性能吗?

c# - ASP.NET WebApi JSON 响应和带有外键的实体

database - 如何利用 PostgreSQL DDL 解析器?

mysql - SQL如何创建具有唯一键的表?

database - 创建分区使用本地时区的时间戳 [Oracle 11g]