无法在MySql中创建外键

时间:2014-04-11 11:51:53

标签: mysql

它想要创建2个表。已创建1个表但另一个表创建错误!注意:两张表都是Innodb

journal:
---------
jr_date --> primary
entry_no --> primary
description

DDL:

 CREATE TABLE `journal` (
  `jr_date` date NOT NULL,
  `entry_no` smallint(6) NOT NULL,
  `description` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`jr_date`,`entry_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

现在想要创建以下表但收到错误!为什么呢?

ERROR 1215: Cannot add foreign key constraint   
SQL Statement:

CREATE TABLE `accounting`.`journal_details` (    
  `jr_date` DATE NULL,    
  `entry_no` SMALLINT NULL,    
  `serial` TINYINT NULL,    
  INDEX `fk_journal_details_jr_date_idx` (`jr_date` ASC),    
  INDEX `fk_journal_details_entry_no_idx` (`entry_no` ASC),    
  CONSTRAINT `fk_journal_details_jr_date`
    FOREIGN KEY (`jr_date`)    
    REFERENCES `accounting`.`journal` (`jr_date`)    
    ON DELETE CASCADE    
    ON UPDATE CASCADE,    
  CONSTRAINT `fk_journal_details_entry_no`    
    FOREIGN KEY (`entry_no`)    
    REFERENCES `accounting`.`journal` (`entry_no`)    
    ON DELETE CASCADE
    ON UPDATE CASCADE)

我无法理解为什么没有创建外键?

4 个答案:

答案 0 :(得分:1)

此处的问题是jr_dateentry_no是表journal上的复合主键。要在journal_details中引用它,您同样需要将其作为复合键引用,而不是作为2个单个简单外键引用。

即。像这样更改外键:

  CONSTRAINT `fk_journal_details_jr_date_entry_no`
    FOREIGN KEY (`jr_date`, `entry_no`)    
    REFERENCES `accounting`.`journal` (`jr_date`, `entry_no`)    
    ON DELETE CASCADE    
    ON UPDATE CASCADE,    

SqlFiddle here

答案 1 :(得分:1)

您有一个复合主键:

PRIMARY KEY (`jr_date`,`entry_no`)

单独链接这些列是没有任何意义的,因为它们不一定是唯一的。

我非常确定您只需要一个外键。

  CONSTRAINT `fk_journal_details`
    FOREIGN KEY (`jr_date`, `entry_no`)    
    REFERENCES `accounting`.`journal` (`jr_date`, `entry_no`)    
    ON DELETE CASCADE    
    ON UPDATE CASCADE

答案 2 :(得分:0)

您在journals.entry_no上缺少索引。

Reference

  

[对于引用表中的每个外键] ,必须有 [在引用表中] 一个索引,其中引用的列被列为第一个的顺序相同。

PRIMARY KEY上的journals(jr_date, entry_no)涵盖journal.jr_date的引用,但不包括对journals.entry_no的引用;

答案 3 :(得分:0)

此处主键是复合键((jr_dateentry_no))

主键是组合使用,您尝试提供不是主键的单个列的引用。