mysql 错误1822:无法添加外键约束hosp_patient_deptname_fk

kq0g1dla  于 2022-12-17  发布在  Mysql
关注(0)|答案(1)|浏览(239)

我目前正在处理这个表。我得到了表hosp_patient的约束错误,但其他一切都正常。错误代码为:1822.添加外键约束失败。引用表'hosp_department'中缺少约束'hosp_patient_deptname_fk'的索引。以下是sql代码

USE user;
SET FOREIGN_KEY_CHECKS = 0; 
DROP TABLE IF EXISTS hosp_department;
CREATE TABLE hosp_department
(
    dept_number     INT         PRIMARY KEY,
    dept_name       VARCHAR(20)     NOT NULL              ,
    dept_location   VARCHAR(20)                           ,
    dept_authorization VARCHAR(20)
);


DROP TABLE IF EXISTS hosp_employee;
CREATE TABLE hosp_employee
(
    emp_id  INT     PRIMARY KEY     AUTO_INCREMENT,
    emp_fname       VARCHAR(20)     NOT NULL,
    emp_mname       VARCHAR(20),
    emp_lname       VARCHAR(20)     NOT NULL,
    emp_ssn         INT(9)                  ,
    emp_salary      INT             NOT NULL,
    emp_city        VARCHAR(50)             ,
    emp_state       VARCHAR(50)             ,
    emp_zip         INT                     ,
    emp_supervisor_id   INT                 ,
    emp_department_id INT,
    CONSTRAINT hosp_employee_supervisor_fk FOREIGN KEY (emp_supervisor_id) 
    REFERENCES hosp_employee(emp_id),
    CONSTRAINT hosp_employee_department_fk FOREIGN KEY (emp_department_id) REFERENCES 
    hosp_department(dept_number)
);


-- hosp_patient
-- need to fix last constraint

DROP TABLE IF EXISTS hosp_patient;
CREATE TABLE hosp_patient
(
    patient_id      INT         PRIMARY KEY AUTO_INCREMENT,
    patient_fname   VARCHAR(20)     NOT NULL              ,
    patient_mname   VARCHAR(20)                           ,
    patient_lname   VARCHAR(20)     NOT NULL              , 
    patient_dob     INT                                   ,
    patient_sex     CHAR(1)                               ,
    patient_floornumber INT                               , 
    patient_deptname    VARCHAR(20)                       ,
    CONSTRAINT hosp_patient_floornumber_fk FOREIGN KEY (patient_floornumber) 
    REFERENCES hosp_department(dept_number),
    CONSTRAINT hosp_patient_deptname_fk FOREIGN KEY (patient_deptname)
    REFERENCES hosp_department(dept_name)
); 


SET FOREIGN_KEY_CHECKS = 1;
c9qzyr3d

c9qzyr3d1#

简单地说,您已经为被引用表中的非主键列定义了一个外键约束,表hosp_department的PK是dept_number,而不是dept_name
请记住,外键 * 必须引用被引用表中的唯一行。* 模式中没有任何内容可以阻止您将相同的部门名称分配给两个不同的部门ID;如果发生这种情况,则DB引擎不能知道患者实际上指的是哪个部门。
一些数据库管理系统(比如MS-SQL Server)允许你在引用表中创建一个FK到一个 UNIQUE 字段。换句话说,如果你在那个列上定义了一个UNIQUE约束,或者如果你在那个列上定义了一个UNIQUE索引,你就可以创建一个FK到hosp_department.dept_name。我不知道MySQL是否允许这样做,但是无论哪种方式,我都认为这是非常糟糕的做法。
FK需要在一个好的DB设计中引用主键,除非有一个非常好的(并且非常不寻常的)理由。所以,您应该重新考虑整个模式。干杯。

相关问题