簡體   English   中英

MySQL 1215:無法添加外鍵約束

[英]MySQL 1215: Cannot add foreign key constraint

您能否建議CHARGEITEM,發票和付款可能失敗? 我在這里想念什么?

我檢查了這些:

  • 所有PK和FK均為BIGINT列
  • 我將它們設置為可為空的列
  • 刪除了約束名稱(認為它們可能發生沖突)
  • 添加了刪除限制
  • 我還檢查了所有這些都是INNODB。

這是完整的腳本(表6、8和9失敗):

CREATE TABLE `BUILDING` (
  `ID` BIGINT NOT NULL AUTO_INCREMENT,
  `NAME` varchar(255) DEFAULT NULL,
  `ADDRESS` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


CREATE TABLE `ROOM` (
  `ID` BIGINT NOT NULL AUTO_INCREMENT,
  `BUILDINGID` BIGINT NULL DEFAULT NULL,
  `FLOORNUM` varchar(255) DEFAULT NULL,
  `DOORNUM` varchar(255) DEFAULT NULL,
  `TYPE` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `BUILDINGID` (`BUILDINGID`),
  FOREIGN KEY (`BUILDINGID`) REFERENCES `BUILDING` (`ID`) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `BOOKING` (
  `ID` BIGINT NOT NULL AUTO_INCREMENT,
  `ENTRYDATE` datetime DEFAULT NULL,
  `GUESTNAME` varchar(255) DEFAULT NULL,
  `GUESTCONTACT` varchar(255) DEFAULT NULL,
  `GUESTADDRESS` varchar(255) DEFAULT NULL,
  `GUESTIDTYPE` varchar(255) DEFAULT NULL,
  `GUESTIDNUM` varchar(255) DEFAULT NULL,
  `GUESTPASSPORTNUM` varchar(255) DEFAULT NULL,
  `NOTES` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `BOOKINGROOM` (
  `ID` BIGINT NOT NULL AUTO_INCREMENT,
  `BOOKINGID` BIGINT NULL DEFAULT NULL,
  `ROOMID` BIGINT NULL DEFAULT NULL,
  `STARTDATE` date DEFAULT NULL,
  `ENDDATE` date DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `BOOKINGID` (`BOOKINGID`),
  KEY `ROOMID` (`ROOMID`),
  FOREIGN KEY (`BOOKINGID`) REFERENCES `BOOKING` (`ID`) ON DELETE RESTRICT,
  FOREIGN KEY (`ROOMID`) REFERENCES `ROOM` (`ID`) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


CREATE TABLE `CHARGE` (
  `ID` BIGINT NOT NULL AUTO_INCREMENT,
  `CHARGEGROUP` varchar(255) DEFAULT NULL,
  `CHARGECODE` varchar(255) DEFAULT NULL,
  `NOTES` varchar(255) DEFAULT NULL,
  `UNIT` varchar(255) DEFAULT NULL,
  `UNITRATE` double NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `CHARGEITEM` (
  `ID` BIGINT NOT NULL AUTO_INCREMENT,
  `BOOKINGID` BIGINT NULL DEFAULT NULL,
  `ROOMID` BIGINT NULL DEFAULT NULL,
  `CHARGEID` BIGINT NULL DEFAULT NULL,
  `ENTRYSTAFFID` BIGINT NULL DEFAULT NULL,
  `ENTRYDATE` datetime DEFAULT NULL,
  `VALUEDATE` date DEFAULT NULL,
  `UNIT` varchar(255) DEFAULT NULL,
  `UNITRATE` double NOT NULL,
  `UNITS` double NOT NULL,
  `AMOUNT` double NOT NULL,
  `NOTES` varchar(255) DEFAULT NULL,
  `INVOICEID` BIGINT NULL DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `INVOICEID` (`INVOICEID`),
  KEY `ROOMID` (`ROOMID`),
  KEY `BOOKINGID` (`BOOKINGID`),
  KEY `CHARGEID` (`CHARGEID`),
  FOREIGN KEY (`INVOICEID`) REFERENCES `INVOICE` (`ID`) ON DELETE RESTRICT,
  FOREIGN KEY (`ROOMID`) REFERENCES `ROOM` (`ID`) ON DELETE RESTRICT,
  FOREIGN KEY (`BOOKINGID`) REFERENCES `BOOKING` (`ID`) ON DELETE RESTRICT,
  FOREIGN KEY (`CHARGEID`) REFERENCES `CHARGE` (`ID`) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `DROPDOWNENTRY` (
  `ID` BIGINT NOT NULL AUTO_INCREMENT,
  `MODULE` varchar(255) DEFAULT NULL,
  `POSITION` int(11) NOT NULL,
  `KEY` varchar(255) DEFAULT NULL,
  `VALUE` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `INVOICE` (
  `ID` BIGINT NOT NULL AUTO_INCREMENT,
  `BOOKINGID` varchar(255) NOT NULL,
  `ENTRYSTAFFID` BIGINT NULL DEFAULT NULL,
  `ENTRYDATE` datetime DEFAULT NULL,
  `AUTHSTAFFID` BIGINT NULL DEFAULT NULL,
  `AUTHDATE` datetime DEFAULT NULL,
  `NETAMOUNT` double NOT NULL,
  `TAX1` double NOT NULL,
  `TAX2` double NOT NULL,
  `TAX3` double NOT NULL,
  `TOTALTAX` double NOT NULL,
  `TOTALINCLTAX` double NOT NULL,
  PRIMARY KEY (`ID`),
  KEY `BOOKINGID` (`BOOKINGID`),
  FOREIGN KEY (`BOOKINGID`) REFERENCES `BOOKING` (`ID`) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `PAYMENT` (
  `ID` BIGINT NOT NULL AUTO_INCREMENT,
  `INVOICEID` BIGINT NULL DEFAULT NULL,
  `AMOUNTPAID` double NOT NULL,
  `PAYMODE` varchar(255) DEFAULT NULL,
  `ENTRYDATE` datetime DEFAULT NULL,
  `VALUEDATE` date DEFAULT NULL,
  `REALISATIONDATE` date DEFAULT NULL,
  `BANKCODE` varchar(255) DEFAULT NULL,
  `INSTRUMENTNUM` varchar(255) DEFAULT NULL,
  `POSCODE` varchar(255) DEFAULT NULL,
  `REALISATIONSTATUS` varchar(255) DEFAULT NULL,
  `NOTES` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `INVOICEID` (`INVOICEID`),
  FOREIGN KEY (`INVOICEID`) REFERENCES `INVOICE` (`ID`) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `RESERVATION` (
  `ID` BIGINT NOT NULL AUTO_INCREMENT,
  `ENTRYDATE` datetime DEFAULT NULL,
  `FROMDATE` date DEFAULT NULL,
  `TODATE` date DEFAULT NULL,
  `NUMROOMS` int(11) NOT NULL,
  `GUESTNAME` varchar(255) DEFAULT NULL,
  `GUESTCONTACT` varchar(255) DEFAULT NULL,
  `GUESTADDRESS` varchar(255) DEFAULT NULL,
  `NOTES` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

兩個問題:

  • 當您在另一個表中引用它時, INVOICES不存在。 在引用之前定義表,或者在創建所有表之后定義約束。
  • INVOICES表中,您正在定義數據類型varchar(255),但在外鍵中,它引用的是bigint列-不起作用。

    INVOICES表中,

     `BOOKINGID` varchar(255) NOT NULL, 

    更改為:

     `BOOKINGID` BIGINT NOT NULL, 

固定在這里-

http://rextester.com/JAZOUD38011

數據庫不支持向外鍵引用。 例如,在CHARGEITEM ,您具有:

FOREIGN KEY (`INVOICEID`) REFERENCES `INVOICE` (`ID`) ON DELETE RESTRICT,

但是, INVOICE表是 CHARGEITEM 之后 CHARGEITEM 因此,這將失敗,依此類推。

兩種選擇:

  • 排列您的表,以便在引用它們之前創建它們。 請注意,這並非總是可能的,因為您的數據模型可以具有循環引用。
  • 首先定義所有表,然后使用alter table add constraint定義所有外鍵引用。

您的問題在這里:

ON DELETE RESTRICT :如果該表中有一條記錄未指向現有的主鍵,則約束創建將失敗。 這包括null

在您說在那里需要空值之后,它將無法工作。 將約束設置為ON RESTRICT SET NULL或使字段NOT NULL

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM