【问题标题】:Foreign key with composite primary key not working in MySql具有复合主键的外键在 MySql 中不起作用
【发布时间】:2011-06-24 03:06:45
【问题描述】:

我有以下 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);

这是因为复合主键吗?

【问题讨论】:

  • 为什么在 stateprovince 表中使用 CountryName 作为复合主键和外键。单独使用 CountryName 作为外键不是更好吗?

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


【解决方案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);

【讨论】:

    【解决方案2】:

    只有 InnoDB 引擎支持foreign keys

    InnoDB 支持外键约束。

    【讨论】:

      【解决方案3】:

      根据这篇文章,这与此无关

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

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

      【讨论】:

        【解决方案4】:

        @Benju。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-04
          • 2018-02-02
          • 2013-04-30
          • 2020-02-19
          相关资源
          最近更新 更多