【问题标题】:Cannot add foreign key constraint on a date field无法在日期字段上添加外键约束
【发布时间】:2013-12-01 15:32:10
【问题描述】:

我有以下 SQL 语句:

CREATE TABLE patient(
  Name varchar(255),
  Geburtsdatum date,
  CONSTRAINT pk_patient PRIMARY KEY (Name,Geburtsdatum)
);

CREATE TABLE fake(
  Name varchar(255),
  PName varchar(255),
  PGeburtsdatum date,
  CONSTRAINT pk_fake PRIMARY KEY (Name,PName,PGeburtsdatum),
  CONSTRAINT fk_PName2 FOREIGN KEY (PName) REFERENCES patient(Name) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT fk_PGeburtsdatum FOREIGN KEY (PGeburtsdatum) REFERENCES patient(Geburtsdatum) ON DELETE CASCADE ON UPDATE CASCADE
);

这给了我错误“#1215 - 无法添加外键约束”。如果我删除第二个表创建中的最后一个约束,一切正常。我所有其他外键约束的工作方式完全相同。我在这里错过了什么?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    不知道您为什么将mysql 问题标记为db2。无论如何,MySQL documentation 声明:

    MySQL 需要外键和引用键的索引,以便外键检查可以快速且不需要表扫描

    所以在Geburtsdatum 列中添加一个索引:

    CREATE TABLE patient(
      Name varchar(255),
      Geburtsdatum date,
      INDEX (Geburtsdatum),
      CONSTRAINT pk_patient PRIMARY KEY (Name,Geburtsdatum)
    );
    

    【讨论】:

    • 我对字符串或整数还有其他外键约束,它们在没有索引的情况下工作。
    • 那是违反 MySQL 文档的。您可以创建一个 fiddle 来为非索引列创建外键吗?
    • 主键创建唯一索引 :) 您可以通过从小提琴的前 2 个表中的任何一个中删除 PRIMARY KEY 来检查。创建将再次失败
    • 但是 Geburtsdatum 也被定义为主键。
    • 不,它是复合主键。不能以这种方式使用索引。首先在第一个字段上进行排序,然后在第二个字段上进行排序。因此,该顺序与相反的顺序不同。
    猜你喜欢
    • 2020-09-26
    • 1970-01-01
    • 2020-09-12
    • 2017-07-16
    • 2013-03-10
    • 2021-11-05
    • 2018-02-13
    相关资源
    最近更新 更多