【问题标题】:MySQL Error Code: 1215. Cannot add foreign key constraintMySQL 错误代码:1215。无法添加外键约束
【发布时间】:2017-09-18 11:44:19
【问题描述】:

我在 MySQL 中创建了两个表。他们的创建查询如下

CREATE TABLE ix_consultant_affected_columns (
  master_id int(10) NOT NULL,
  logging_session int(10) NOT NULL,
  text_id bigint(20) NOT NULL,
  table_id int(10) NOT NULL,
  column_id int(10) NOT NULL,
  PRIMARY KEY (text_id, master_id, logging_session, table_id, column_id)
) ENGINE = INNODB DEFAULT charset = latin1;

CREATE TABLE ix_consultant_query_text (
  master_id int(10) NOT NULL,
  logging_session int(10) NOT NULL,
  text_id bigint(20) NOT NULL,
  count int(10) NOT NULL,
  discarded tinyint(3) DEFAULT NULL,
  query_type varchar(1) DEFAULT NULL,
  no_tuner_score float DEFAULT NULL,
  num_rows_affected float DEFAULT NULL,
  text_plan longtext,
  PRIMARY KEY (logging_session, master_id, text_id)
) ENGINE = INNODB DEFAULT charset = latin1;

现在我想在更改查询中应用外键。但它给出了
错误代码:1215。无法添加外键约束
更改查询是:

ALTER TABLE ix_consultant_affected_columns
  ADD FOREIGN KEY (master_id) REFERENCES ix_consultant_query_text (master_id),
  ADD FOREIGN KEY (logging_session) REFERENCES ix_consultant_query_text (logging_session),
  ADD FOREIGN KEY (text_id) REFERENCES ix_consultant_query_text (text_id);

我尝试寻找两者之间的约束或数据类型差异。但我无法确定问题所在。
注意:如果我只使用 logging_session 列运行更改查询,则查询工作正常并应用外键。问题在于 master_id 和 text_id

编辑:

我发现问题是更改查询不在引用表的序列中。 ix_consultant_query_text 表中的主索引序列为:

  1. logging_session
  2. master_id
  3. text_id

因此,当我在引用表的主索引序列中创建更改查询时,它运行良好。

ALTER TABLE ix_consultant_affected_columns 
    ADD FOREIGN KEY (logging_session,master_id,text_id) REFERENCES ix_consultant_query_text(logging_session,master_id,text_id)

现在的问题是我正在动态创建这个alter查询,那么有没有办法从引用的表中获取列的序列(主索引)?

【问题讨论】:

    标签: mysql foreign-keys primary-key alter-table


    【解决方案1】:

    您正在尝试将三个外键添加到 ix_consultant_query_text 表中的下一个字段:

    • text_id
    • master_id
    • logging_session

    但只有ix_consultant_query_text.logging_session 是唯一的。 外键创建要求所有引用的字段都是唯一的。

    【讨论】:

    • 主键应用于 ix_consultant_query_text 中的 text_id、master_id 和 logging_session。那么 logging_session 是如何唯一的呢?还有什么办法可以解决这个问题?
    • 主键很复杂,它包含几个字段:logging_sessionmaster_idtext_id。可以说,所有这些领域形成了独特的群体。而且我们可以说比只有第一个字段还独一无二。所有其他的,都不是唯一的。
    • 需要创建三个外键吗?或者,可能需要创建一个具有三个相关字段的复杂外键?我认为您应该更多地了解您需要的数据库架构。
    • 我什至可以创建一个复杂的外键。使用手动查询我找到了一个解决方案,但我不知道如何获取表的主索引序列。请检查更新的问题
    • 您可以从 information_schema.KEY_COLUMN_USAGE 系统表中获取索引/外键列的列表。但是,我认为每次都动态创建密钥并不是一个好主意。最好考虑数据库模式逻辑,使数据库稳定,而不是每次都更改。
    猜你喜欢
    • 2018-05-13
    • 2015-05-27
    • 2014-10-22
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 2016-05-01
    • 2018-11-10
    相关资源
    最近更新 更多