【问题标题】:MySQL: Failed to add the foreign key constraintMySQL:添加外键约束失败
【发布时间】:2020-09-17 00:16:56
【问题描述】:

我有两张桌子,clinicsconsultations
每个咨询记录都属于一个诊所,所以我想我会将clinic_name 设置为引用clinics 表中的clinic_name 的外键。但它会抛出一个错误:

code: 'ER_FK_NO_INDEX_PARENT',
errno: 1822, sqlMessage: "Failed to add the foreign key constraint. Missing index for constraint 'consultations_ibfk_1' in the referenced table 'clinics'",

诊所表:

const sql_createclinics =
  "CREATE TABLE IF NOT EXISTS clinics(" +
  "id INT AUTO_INCREMENT, " +
  "email VARCHAR(255) NOT NULL, " +
  "password VARCHAR(255) NOT NULL, " +
  "clinic_name VARCHAR(255) NOT NULL, " +
  "phone_num VARCHAR(15) NOT NULL, " +
  "address VARCHAR(255) NOT NULL, " +
  "PRIMARY KEY (id))";

**咨询表:**
const sql_createconsult =
  "CREATE TABLE IF NOT EXISTS consultations(" +
  "id INT AUTO_INCREMENT, " +
  "clinic_name VARCHAR(255), " +
  "doctor_name VARCHAR(255), " +
  "patient_name VARCHAR(255), " +
  "diagnosis VARCHAR(255), " +
  "medication VARCHAR(255), " +
  "consultation_fee FLOAT, " +
  "datetime DATETIME DEFAULT CURRENT_TIMESTAMP, " +
  "PRIMARY KEY (id)," +
  "FOREIGN KEY (clinic_name) REFERENCES clinics(clinic_name))";

【问题讨论】:

  • 只是为了澄清——我只是在FOREIGN KEY 部分之前添加CONSTRAINT FK_clinicname
  • clinic_name 不是诊所表中的主键
  • 我应该在咨询中使用FOREIGN KEY (id) REFERENCES clinics(id)吗?
  • 是的,可以。但您不需要在consultations 表中将 ID 声明为 Auto Increment 列
  • @SoumendraMishra 是有道理的。谢谢!

标签: mysql sql foreign-keys one-to-many


【解决方案1】:

你可以试试这个:

CREATE TABLE IF NOT EXISTS consultations( 
  id INT,  
  clinic_name VARCHAR(255),  
  doctor_name VARCHAR(255),  
  patient_name VARCHAR(255),  
  diagnosis VARCHAR(255),  
  medication VARCHAR(255),  
  consultation_fee FLOAT,  
  datetime DATETIME DEFAULT CURRENT_TIMESTAMP,  
  FOREIGN KEY (id) REFERENCES clinics(id));

【讨论】:

    【解决方案2】:

    外键应该引用另一个表中的单个记录。 使用您的架构定义,您无法保证 Clinic_name 是唯一的。如果clinics.clinic_name 是唯一的,请通过为其创建唯一索引来强制它在您的数据库中。否则不要使用 Clinic_name 作为外键,而是将诊所 id 放在 consulations 中并使用 id 创建外键约束。

    以 Clinic_id 作为关系:

    const sql_createconsult =
    "CREATE TABLE IF NOT EXISTS consultations(" +
    "id INT AUTO_INCREMENT, " +
    "clinic_id INT, " +
    "doctor_name VARCHAR(255), " +
    "patient_name VARCHAR(255), " +
    "diagnosis VARCHAR(255), " +
    "medication VARCHAR(255), " +
    "consultation_fee FLOAT, " +
    "datetime DATETIME DEFAULT CURRENT_TIMESTAMP, " +
    "PRIMARY KEY (id)," +
    "FOREIGN KEY (clinic_id) REFERENCES clinics(clinic_id))";
    

    【讨论】:

    • clinic_id 是 INT 类型,clinic_name 是 VARCHAR(255)
    • clinic_id 列在clinics 表中不存在
    • 你看过我的回答了吗?最好在关系中引用真正的主键。明天诊所名称更改时,您将必须更新与该诊所相关的所有咨询。但是,如果您想坚持使用 Clinic_name,则必须通过添加唯一约束/索引来使其唯一。
    猜你喜欢
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 2014-06-01
    相关资源
    最近更新 更多