我想问一些困扰我很多天的事情......
这就是我的意思:
我创建了这两个表:
CREATE TABLE IF NOT EXISTS journal (
issn varchar(20) NOT NULL,
j_title varchar(100) NOT NULL,
j_publisher varchar(30) NOT NULL,
PRIMARY KEY (issn)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS volume (
volume_no int(11) NOT NULL,
issn varchar(20) NOT NULL,
year int(11) NOT NULL,
PRIMARY KEY (issn,volume_no),
FOREIGN KEY (issn) REFERENCES journal(issn)
) ENGINE=InnoDB;
当我尝试创建它时:
CREATE TABLE IF NOT EXISTS issue (
issue_no int(11) NOT NULL,
issue_pages varchar(10) NOT NULL,
issue_date varchar(10) NOT NULL,
issn varchar(20) NOT NULL,
volume_no int(11) NOT NULL,
PRIMARY KEY (issue_no,issn,volume_no),
FOREIGN KEY (issn) REFERENCES journal(issn),
FOREIGN KEY (volume_no) REFERENCES volume(volume_no)
) ENGINE=InnoDB;
它会抛出错误(错误150)
错误在外键volume_no中。
没有FOREIGN KEY (volume_no) REFERENCES volume(volume_no)
表创建没有问题....我无法解释发生了什么......我已经多次看到它但没有一次!有人知道发生了什么吗?
提前致谢!!
答案 0 :(得分:3)
我可以看到外键不包含issn
但实际上包含在primary key
的卷表中。
CREATE TABLE IF NOT EXISTS issue ( issue_no int(11) NOT NULL,
issue_pages varchar(10) NOT NULL,
issue_date varchar(10) NOT NULL,
issn varchar(20) NOT NULL,
volume_no int(11) NOT NULL,
PRIMARY KEY (issue_no,issn,volume_no),
FOREIGN KEY (issn,volume_no) REFERENCES volume(issn,volume_no) ) ENGINE=InnoDB;
看下面的sql小提琴。 http://sqlfiddle.com/#!2/55a63
答案 1 :(得分:0)
如果父表的PK多于一个字段,则FK中字段的顺序必须与PK中的顺序相同。
issue: FOREIGN KEY (issn, volume_no) REFERENCES volume(issn, volume_no)
必须满足这些条件才能得到错误150:
ENGINE=InnoDB
。来源:MySQL Creating tables with Foreign Keys giving errno: 150
答案 2 :(得分:0)
也许volume_no需要是UNSIGNED
答案 3 :(得分:0)
FOREIGN
个密钥必须引用父表中的PRIMARY
或UNIQUE
密钥。
表issue
只需要一个外键,而不是两个。它应该引用volume
的主键:
CREATE TABLE IF NOT EXISTS issue (
issue_no int(11) NOT NULL,
issue_pages varchar(10) NOT NULL,
issue_date varchar(10) NOT NULL,
issn varchar(20) NOT NULL,
volume_no int(11) NOT NULL,
PRIMARY KEY (issn, volume_no, issue_no),
FOREIGN KEY (issn, volume_no)
REFERENCES volume(issn, volume_no)
) ENGINE=InnoDB;
答案 4 :(得分:0)
我的数据库存在同样的问题。它不是关于外键的定义,实际上它是主键字段的定义。
CREATE TABLE tblProcesses(
CREATE TABLE tblProcessesMessage( fldProcesses TEXT NOT NULL,
tblProcesses(fldProcessesID)中的主键没有UNSIGNED关键字,而tblProcessesMessage(fldProcessesID)中的外键具有UNSIGNED关键字。此关键字导致问题 - 字段类型不一致。所以我在tblPreocesses中将fsProcessesID添加了UNSIGNED关键字:
CREATE TABLE tblProcesses( fldProcessesID SMALLINT(5) UNSIGNED UNIQUE NOT NULL AUTO_INCREMENT,
我希望这能帮助您解决问题。 最好的祝福, 尼古拉斯