MySQL 外键导致表删除

标签 mysql foreign-keys relational-database primary-key

之前此代码存在问题,该问题已解决并导致表正常工作,但现在我收到错误 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/

相关文章:

mysql - 在表中存储非数字注册号的数据类型

python - 奥杜 10 : How to insert value to a many2one field in table with create method?

mySQL表,主键

mysql - 无法通过给定的 varchar 列选择行,其中行的列中有句点 ('.' )

sql - PostgreSQL 在外键中使用常量

ruby-on-rails - 下拉菜单中包含其他模型的值

c# - Web API 核心 : "FOREIGN KEY constraint failed" error during POST request SQLite

php - 具有嵌套/层次关系表的 SQL 查询

php - 如何使用 php 通过更新按钮更新多个 mysql 字段

mysql - 想要在 NSIS 中创建具有完全权限的 mysql 用户