之前此代码存在问题,该问题已解决并导致表正常工作,但现在我收到错误 1005,并且由于 fk 而无法创建表
这是第一个表的代码
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS Customer;
CREATE TABLE Customer
(
CustomerNumber int NOT NULL,
CustomerName varchar(255),
CustomerAddress varchar(255),
CustomerPhoneNumber varchar(255),
JoinDate varchar(255),
PetName varchar(255),
PayScheme varchar(255),
PremiumPayDate varchar(255),
PRIMARY KEY (CustomerNumber)
);
这是第二个表的代码
DROP TABLE IF EXISTS Policies;
CREATE TABLE Policies
(
PolicyID int NOT NULL,
PolicyNumber int NOT NULL,
PetType varchar(255),
CustomerNumber int NOT NULL,
PetName varchar(255),
EffectiveDate varchar(255),
PRIMARY KEY (PolicyID),
CONSTRAINT fk_CustomerNumber
FOREIGN KEY (CustomerNumber)
REFERENCES Customer(CustomerNumber),
CONSTRAINT fk_PetName
FOREIGN KEY (PetName)
REFERENCES Customer(PetName)
);
错误代码为
19:05:38CREATE TABLE Policies ( PolicyID int NOT NULL, PolicyNumber int NOT NULL, PetType varchar(255), CustomerNumber int NOT NULL, PetName varchar(255), EffectiveDate varchar(255), PRIMARY KEY (PolicyID), CONSTRAINT fk_CustomerNumber FOREIGN KEY (CustomerNumber) REFERENCES Customer(CustomerNumber), CONSTRAINT fk_PetName FOREIGN KEY (PetName) REFERENCES Customer(PetName) ) Error Code: 1005. Can't create table 'cis22723684.Policies' (errno: 150) 0.031 sec
我已经解决了问题,请参阅已编辑的代码。
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS Customer;
CREATE TABLE Customer
(
CustomerNumber int NOT NULL,
CustomerName varchar(255),
CustomerAddress varchar(255),
CustomerPhoneNumber varchar(255),
JoinDate varchar(255),
PetName varchar(255),
PayScheme varchar(255),
PremiumPayDate varchar(255),
PRIMARY KEY (CustomerNumber, PetName)
);
DROP TABLE IF EXISTS Policies;
CREATE TABLE Policies
(
PolicyID int NOT NULL,
PolicyNumber int NOT NULL,
PetType varchar(255),
CustomerNumber int NOT NULL,
PetName varchar(255),
EffectiveDate varchar(255),
PRIMARY KEY (PolicyID),
CONSTRAINT fk_CustomerNumber
FOREIGN KEY (CustomerNumber, PetName)
REFERENCES Customer(CustomerNumber, PetName)
);
它似乎使用 pk 作为复合 Material ,并将 pks 包含在一个约束下
但是,当我尝试创建一个新的 fk 时,尽管保留了使用的代码,但我收到了与以前相同的错误代码
第一个表
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS Customer;
CREATE TABLE Customer
(
CustomerNumber int NOT NULL,
CustomerName varchar(255),
CustomerAddress varchar(255),
CustomerPhoneNumber varchar(255),
JoinDate varchar(255),
PetName varchar(255),
PayScheme varchar(255),
PremiumPayDate varchar(255),
PRIMARY KEY (CustomerNumber, PetName)
);
第二个表
DROP TABLE IF EXISTS Policies;
CREATE TABLE Policies
(
PolicyID int NOT NULL,
PolicyNumber int NOT NULL,
PetType varchar(255),
CustomerNumber int NOT NULL,
PetName varchar(255),
EffectiveDate varchar(255),
PRIMARY KEY (PolicyID),
CONSTRAINT fk_CustomerNumber_PetName
FOREIGN KEY (CustomerNumber, PetName)
REFERENCES Customer(CustomerNumber, PetName)
);
第三个表
DROP TABLE IF EXISTS Claims;
CREATE TABLE Claims
(
ClaimsID int NOT NULL,
AmountForReimbursement varchar(255),
PolicyID varchar(255),
PRIMARY KEY (ClaimsID),
CONSTRAINT fk_PolicyID
FOREIGN KEY (PolicyID)
REFERENCES Policies(PolicyID)
);
这是一个简单的问题,int NOT NULL 被识别为 varchar,我需要一些 sleep :')
最佳答案
问题出在下面的第二个约束中,您试图引用非键列PetName
,这是不可能的,并且违反规范化概念。您的 Customer
表仅将主键定义为 PRIMARY KEY (CustomerNumber)
。
CONSTRAINT fk_PetName
FOREIGN KEY (PetName)
REFERENCES Customer(PetName)
从 CREATE
语句中删除上述 FK 约束定义,它就可以正常工作。不信那就看这个 fiddle :http://sqlfiddle.com/#!9/86a927
根据您的编辑:您的 FK 约束定义必须如下所示。请参阅修改后的 fiddle :http://sqlfiddle.com/#!9/3a019
CONSTRAINT fk_CustomerNumber_PetName
FOREIGN KEY (CustomerNumber, PetName)
REFERENCES Customer(CustomerNumber, PetName)
关于MySQL 外键导致表删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41492501/