在 MySQL5 中添加复合外键失败

Posted

技术标签:

【中文标题】在 MySQL5 中添加复合外键失败【英文标题】:Adding composite foreign key fails in MySQL5 【发布时间】:2011-10-03 05:50:19 【问题描述】:

我试图强制用户地址信息中的州/省和国家/地区名称来自我列出国家和州/省的一组表。为了做到这一点,我尝试运行这样的 alter table 命令...

ALTER TABLE User
    ADD FOREIGN KEY (stateProvince,country)
    REFERENCES `StateProvince`(`name`,`countryName`);

然后我收到这条消息...

使用外键创建表'realtorprint_dev/#sql-d5c_3d' 约束失败。引用的表中没有索引 引用的列显示为第一列。

有人知道如何处理此错误消息吗?

这是州和国家/地区表的创建...

CREATE TABLE Country (
  name varchar(40) NOT NULL,
  abbreviation varchar(4) NOT NULL,
  PRIMARY KEY  (name)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE StateProvince (
  countryName varchar(40) NOT NULL,
  name varchar(100) NOT NULL,
  abbreviation varchar(3) NOT NULL,
  PRIMARY KEY  (countryName,name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

alter table StateProvince
add constraint FK_StateProvince_Country
foreign key (countryName)
references Country (name);

现在对于用户表...

create table realtorprint_dev.user (
  id bigint not null,
  created datetime,
  email varchar(255) not null,
  fax varchar(255),
  mobile varchar(255),
  name varchar(255),
  password varchar(255),
  phone varchar(255),
  title varchar(255),
  tollFree varchar(255),
  updated datetime,
  web varchar(255),
  brokerage_id bigint,
  address varchar(255),
  city varchar(255),
  country varchar(255),
  stateProvince varchar(255),
  type varchar(255),
  zipPostal varchar(255),
  activated bit not null,
  locked bit not null,
  primary key (id),
  foreign key FK285FEB6722226 (brokerage_id) references brokerage(id)
);

【问题讨论】:

【参考方案1】:

在被引用的列作为第一列出现的引用表中没有索引。

您需要一个关于 StateProvince.(name,countryName) 的索引,但您有一个关于 StateProvince.(countryName,name) 的索引。尝试颠倒索引或 FK 引用的顺序。

【讨论】:

【参考方案2】:

由于您没有显示 create 语句,我不确定,但我相信这与 realtorprint_dev 表没有主键有关。

【讨论】:

以上是关于在 MySQL5 中添加复合外键失败的主要内容,如果未能解决你的问题,请参考以下文章

mysql外键仅引用复合主键的一部分

通过 PhpMyAdmin 的复合外键约束?

如何为具有复合主键的表构建外键?

从外键和日期时间创建复合键

将复合键映射到两个外键

在 merge() 操作中丢失复合外键(JPA/Hibernate)