2

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

这就是我的意思:

我创建了这两个表:

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;

它抛出一个错误(errno 150)

错误在外键 volume_no 中。

没有FOREIGN KEY (volume_no) REFERENCES volume(volume_no)

该表的创建没有问题....我无法解释发生了什么...我一次又一次地看到它,但什么也没有!有人知道发生了什么吗?

提前致谢!!

4

5 回答 5

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 fiddle。 http://sqlfiddle.com/#!2/55a63

于 2012-08-14T09:16:57.260 回答
0

如果父表的PK多于一个字段,则FK中字段的顺序必须与PK中的顺序一致。

issue: FOREIGN KEY (issn, volume_no) REFERENCES volume(issn, volume_no)

必须满足这些条件才能不出现错误 150:

  1. 这两个表必须是ENGINE=InnoDB.
  2. 这两个表必须具有相同的字符集。
  3. 父表中的 PK 列和 FK 列必须是相同的数据类型。
  4. 父表中的 PK 列和 FK 列,如果它们具有定义排序规则类型,则必须具有相同的排序规则类型;
  5. 如果外键表中已有数据,则 FK 列值必须与父表 PK 列中的值匹配。

来源:MySQL 使用外键创建表,给出 errno:150

于 2012-08-14T09:14:56.353 回答
0

也许 volume_no 需要取消签名

于 2012-08-14T09:17:42.717 回答
0

FOREIGN键必须引用父表中的一个PRIMARY或一个UNIQUE键。

您在 table 只需要一个外键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;
于 2012-08-14T09:21:45.693 回答
0

我的数据库也有同样的问题。这不是关于外键的定义,实际上是主键字段的定义。

创建表 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 中将 UNSIGNED 关键字添加到 fldProcessesID:

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

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

于 2012-08-14T09:44:03.223 回答