因此,我作为项目需求试图将外键约束添加到数据库中,并且它第一次或在两个不同的表上运行,但是在尝试添加外键约束时,我在两个表上遇到错误。我收到的错误消息是:
错误1215(HY000):无法添加外键约束
这是我用来创建表的SQL,两个有问题的表是Patient和Appointment。
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=1; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
CREATE SCHEMA IF NOT EXISTS doctorsoffice DEFAULT CHARACTER SET utf8 ; USE doctorsoffice ;
-- Table doctorsoffice.doctor
DROP TABLE IF EXISTS doctorsoffice.doctor ;
CREATE TABLE IF NOT EXISTS doctorsoffice.doctor ( DoctorID INT(11) NOT NULL AUTO_INCREMENT , FName VARCHAR(20) NULL DEFAULT NULL , LName VARCHAR(20) NULL DEFAULT NULL , Gender VARCHAR(1) NULL DEFAULT NULL , Specialty VARCHAR(40) NOT NULL DEFAULT 'General Practitioner' , UNIQUE INDEX DoctorID (DoctorID ASC) , PRIMARY KEY (DoctorID) ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;
-- Table doctorsoffice.medicalhistory
DROP TABLE IF EXISTS doctorsoffice.medicalhistory ;
CREATE TABLE IF NOT EXISTS doctorsoffice.medicalhistory ( MedicalHistoryID INT(11) NOT NULL AUTO_INCREMENT , Allergies TEXT NULL DEFAULT NULL , Medications TEXT NULL DEFAULT NULL , ExistingConditions TEXT NULL DEFAULT NULL , Misc TEXT NULL DEFAULT NULL , UNIQUE INDEX MedicalHistoryID (MedicalHistoryID ASC) , PRIMARY KEY (MedicalHistoryID) ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;
-- Table doctorsoffice.Patient
DROP TABLE IF EXISTS doctorsoffice.Patient ;
CREATE TABLE IF NOT EXISTS doctorsoffice.Patient ( PatientID INT unsigned NOT NULL AUTO_INCREMENT , FName VARCHAR(30) NULL , LName VARCHAR(45) NULL , Gender CHAR NULL , DOB DATE NULL , SSN DOUBLE NULL , MedicalHistory smallint(5) unsigned NOT NULL, PrimaryPhysician smallint(5) unsigned NOT NULL, PRIMARY KEY (PatientID) , UNIQUE INDEX PatientID_UNIQUE (PatientID ASC) , CONSTRAINT FK_MedicalHistory FOREIGN KEY (MEdicalHistory ) REFERENCES doctorsoffice.medicalhistory (MedicalHistoryID ) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT FK_PrimaryPhysician FOREIGN KEY (PrimaryPhysician ) REFERENCES doctorsoffice.doctor (DoctorID ) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB;
-- Table doctorsoffice.Appointment
DROP TABLE IF EXISTS doctorsoffice.Appointment ;
CREATE TABLE IF NOT EXISTS doctorsoffice.Appointment ( AppointmentID smallint(5) unsigned NOT NULL AUTO_INCREMENT , Date DATE NULL , Time TIME NULL , Patient smallint(5) unsigned NOT NULL, Doctor smallint(5) unsigned NOT NULL, PRIMARY KEY (AppointmentID) , UNIQUE INDEX AppointmentID_UNIQUE (AppointmentID ASC) , CONSTRAINT FK_Patient FOREIGN KEY (Patient ) REFERENCES doctorsoffice.Patient (PatientID ) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT FK_Doctor FOREIGN KEY (Doctor ) REFERENCES doctorsoffice.doctor (DoctorID ) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB;
-- Table doctorsoffice.InsuranceCompany
DROP TABLE IF EXISTS doctorsoffice.InsuranceCompany ;
CREATE TABLE IF NOT EXISTS doctorsoffice.InsuranceCompany ( InsuranceID smallint(5) NOT NULL AUTO_INCREMENT , Name VARCHAR(50) NULL , Phone DOUBLE NULL , PRIMARY KEY (InsuranceID) , UNIQUE INDEX InsuranceID_UNIQUE (InsuranceID ASC) ) ENGINE = InnoDB;
-- Table doctorsoffice.PatientInsurance
DROP TABLE IF EXISTS doctorsoffice.PatientInsurance ;
CREATE TABLE IF NOT EXISTS doctorsoffice.PatientInsurance ( PolicyHolder smallint(5) NOT NULL , InsuranceCompany smallint(5) NOT NULL , CoPay INT NOT NULL DEFAULT 5 , PolicyNumber smallint(5) NOT NULL AUTO_INCREMENT , PRIMARY KEY (PolicyNumber) , UNIQUE INDEX PolicyNumber_UNIQUE (PolicyNumber ASC) , CONSTRAINT FK_PolicyHolder FOREIGN KEY (PolicyHolder ) REFERENCES doctorsoffice.Patient (PatientID ) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT FK_InsuranceCompany FOREIGN KEY (InsuranceCompany ) REFERENCES doctorsoffice.InsuranceCompany (InsuranceID ) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB;
USE doctorsoffice ;
SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
要查找特定错误,请运行以下命令:
SHOW ENGINE INNODB STATUS; 并查看该LATEST FOREIGN KEY ERROR部分。
子列的数据类型必须与父列完全匹配。例如,由于medicalhistory.MedicalHistoryID是INT,Patient.MedicalHistory也需要是INT,而不是SMALLINT。
另外,您应该set foreign_key_checks=0在运行DDL之前运行查询,以便可以以任意顺序创建表,而不需要在相关子表之前创建所有父表。