问题描述
我有两个表clinics
和consultations
。
每个咨询记录都属于一个诊所,因此我想将clinic_name
设置为引用clinic_name
表中clinics
的外键。但这会引发错误:
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))";
解决方法
外键应引用另一个表中的单个记录。
使用您的架构定义,您不能保证clinic_name是唯一的。如果clinics.clinic_name
是唯一的,则通过为其创建唯一索引来在数据库中强制它。否则,请勿使用climate_name作为外键,而应将诊所的id纳入考虑范围,并使用id创建外键约束。
与临床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))";
,
您可以尝试以下方法:
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));