我目前正在处理这个表。我得到了表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;
1条答案
按热度按时间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设计中引用主键,除非有一个非常好的(并且非常不寻常的)理由。所以,您应该重新考虑整个模式。干杯。