[英]MySQL 1215: Cannot add foreign key constraint
您能否建議CHARGEITEM,發票和付款可能失敗? 我在這里想念什么?
我檢查了這些:
這是完整的腳本(表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,
固定在這里-
數據庫不支持正向外鍵引用。 例如,在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.