具有复合主键的外键在MySql中不起作用

时间:2011-06-24 03:06:46

标签: mysql sql foreign-keys foreign-key-relationship ddl

我有以下SQL脚本。运行后,永远不会强制执行外键关系。

CREATE TABLE Country (
  name varchar(40) NOT NULL,
  abbreviation varchar(4) NOT NULL,
  PRIMARY KEY  (name)
) ENGINE=MyISAM  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=MyISAM DEFAULT CHARSET=utf8;

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

这是因为复合主键吗?

4 个答案:

答案 0 :(得分:1)

根据MySQL docs on foreign keys,MyISAM表引擎不支持外键。相反,它默默地忽略了它们。请改用InnoDB。试试这个:

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 index FK_StateProvince_Country (countryName),
add constraint FK_StateProvince_Country
foreign key (countryName)
references Country (name);

答案 1 :(得分:1)

只有InnoDB引擎支持foreign keys

  

InnoDB支持外键约束。

答案 2 :(得分:0)

根据本文

,它与此无关

http://dev.mysql.com/doc/refman/5.0/en/example-foreign-keys.html

  

外键约束不是   仅需加入两张桌子。   对于InnoDB以外的存储引擎   定义列时可以   使用REFERENCES tbl_name(col_name)   条款,没有实际效果,   并仅作为备忘录或评论   对你说你是哪一列   目前定义的目的是   引用另一个表中的列。它   意识到什么时候非常重要   使用以下语法:

答案 3 :(得分:0)

@Benju。

您必须使用InnoDB替换MyISAM,然后您可以将主键用作复合或单个。它有效,我已经测试过了。