【问题标题】:multiple foreign keys cannot be added不能添加多个外键
【发布时间】:2013-07-03 08:04:56
【问题描述】:

我想知道为什么我不能添加这个外键。这是我的架构

CREATE TABLE members(
  member_id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  num_1 int,
  num_2 int,
  password VARCHAR(50) NOT NULL,
  PRIMARY KEY (member_id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE contacts(
  contact_id INT NOT NULL AUTO_INCREMENT,
  s1 int,
  phone_number VARCHAR(10) NOT NULL,
  s2 int,
  s3 int,
  PRIMARY KEY (contact_id),
  FOREIGN KEY (s1) REFERENCES members(num_1) ON DELETE CASCADE ON UPDATE CASCADE,
  FOREIGN KEY (s2) REFERENCES members(num_2) ON DELETE CASCADE ON UPDATE CASCADE,
  FOREIGN KEY (s3) REFERENCES members(member_id) ON DELETE CASCADE ON UPDATE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=utf8

我在 mysql 终端上收到此错误 ERROR 1215 (HY000): Cannot add foreign key constraint

我的架构有问题吗?

【问题讨论】:

  • 您可能在num_1num_2 上没有索引。这可能是原因
  • 通常外键在引用表中需要一个主键
  • @JanneMatikainen 我认为唯一键
  • 唯一键也可以使用
  • 注意: 在某些 RDBMS 中,例如 SQL Server,您可以引用具有唯一索引(非键)的列(请参阅can we have a foreign key which is not a primary key in any other table?),但这不是-标准行为。

标签: mysql


【解决方案1】:

这样对我有用:

CREATE TABLE members(
  member_id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  num_1 int,
  num_2 int,
  password VARCHAR(50) NOT NULL,
  PRIMARY KEY (member_id),
  key idx_num1 (num_1),
  key idx_num2 (num_2)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE contacts(
  contact_id INT NOT NULL AUTO_INCREMENT,
  s1 int,
  phone_number VARCHAR(10) NOT NULL,
  s2 int,
  s3 int,
  PRIMARY KEY (contact_id),
  FOREIGN KEY (s1) REFERENCES members(num_1) ON DELETE CASCADE ON UPDATE CASCADE,
  FOREIGN KEY (s2) REFERENCES members(num_2) ON DELETE CASCADE ON UPDATE CASCADE,
  FOREIGN KEY (s3) REFERENCES members(member_id) ON DELETE CASCADE ON UPDATE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

刚刚添加

  key idx_num1 (num_1),
  key idx_num2 (num_2)

在表成员中。外键需要引用一个索引列(不一定是唯一的,也不一定是NOT NULLable)。

来自manual

InnoDB 允许外键引用任何索引列或列组。但是,在被引用的表中,必须有一个索引,其中被引用的列按相同顺序列为第一列。

【讨论】:

    猜你喜欢
    • 2019-05-04
    • 2016-01-05
    • 1970-01-01
    • 2011-08-11
    • 2015-11-20
    • 2018-10-25
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多