MySQL创建表(errno 150)

时间:2012-08-14 09:08:06

标签: mysql foreign-keys

我想问一些困扰我很多天的事情......

这就是我的意思:

我创建了这两个表:

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)

表创建没有问题....我无法解释发生了什么......我已经多次看到它但没有一次!有人知道发生了什么吗?

提前致谢!!

5 个答案:

答案 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:

  1. 这两个表格必须为ENGINE=InnoDB
  2. 这两个表必须具有相同的字符集。
  3. 父表和FK列中的PK列必须是相同的数据类型。
  4. 父表和FK列中的PK列(如果它们具有定义排序规则类型)必须具有相同的排序规则类型;
  5. 如果外键表中已有数据,则FK列值必须与父表PK列中的值匹配。
  6. 来源:MySQL Creating tables with Foreign Keys giving errno: 150

答案 2 :(得分:0)

也许volume_no需要是UNSIGNED

答案 3 :(得分:0)

FOREIGN个密钥必须引用父表中的PRIMARYUNIQUE密钥。

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(

fldProcessesID SMALLINT(5)UNIQUE NOT NULL AUTO_INCREMENT,

CREATE TABLE tblProcessesMessage( fldProcesses TEXT NOT NULL,

fldProcessesID VARCHAR(15)NOT NULL DEFAULT,

tblProcesses(fldProcessesID)中的主键没有UNSIGNED关键字,而tblProcessesMessage(fldProcessesID)中的外键具有UNSIGNED关键字。此关键字导致问题 - 字段类型不一致。所以我在tblPreocesses中将fsProcessesID添加了UNSIGNED关键字:

CREATE TABLE tblProcesses( fldProcessesID SMALLINT(5) UNSIGNED UNIQUE NOT NULL AUTO_INCREMENT,

我希望这能帮助您解决问题。 最好的祝福, 尼古拉斯