它想要创建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)
我无法理解为什么没有创建外键?
答案 0 :(得分:1)
此处的问题是jr_date
,entry_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,
答案 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
上缺少索引。
[对于引用表中的每个外键] ,必须有 [在引用表中] 一个索引,其中引用的列被列为第一个列的顺序相同。
PRIMARY KEY
上的journals(jr_date, entry_no)
涵盖journal.jr_date
的引用,但不包括对journals.entry_no
的引用;
答案 3 :(得分:0)
此处主键是复合键((jr_date
,entry_no
))
主键是组合使用,您尝试提供不是主键的单个列的引用。