2014-02-21 80 views
0

我想添加表Customers,row= "Customer ID"的外鍵給Table Pet,row= "Customer ID"添加外鍵錯誤

-- Table structure for table `Customers` 

CREATE TABLE IF NOT EXISTS `Customers` (
    `CustomerID` varchar(50) NOT NULL, 
    `Fname` varchar(50) DEFAULT NULL, 
    `LName` varchar(20) DEFAULT NULL, 
    `Tel` varchar(20) DEFAULT NULL, 
    `Fax` varchar(20) DEFAULT NULL, 
    `CustType` varchar(20) DEFAULT NULL, 
    `AdState` varchar(50) DEFAULT NULL, 
    `City` varchar(20) DEFAULT NULL, 
    `Zip` varchar(20) DEFAULT NULL, 
    `Street` varchar(20) DEFAULT NULL, 
    PRIMARY KEY (`CustomerID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

-- Dumping data for table `Customers` 

INSERT INTO `Customers` (`CustomerID`, `Fname`, `LName`, `Tel`, `Fax`, `CustType`, `AdState`, `City`, `Zip`, `Street`) VALUES 
('AC001', 'All', 'Creatures', '206 555-6622', '206 555-7854', '2', 'WA', 'Tall Pines', '98746', '21 Grace St.'), 
('AD001', 'Johnathan', 'Adams', '206 555 7623', '206 555 8855', '1', 'WA', 'Mountain View', '984101012', '66 10th St'), 
('AD002', 'William', 'Adams', '503 555 7623', '503 555 7319', '1', 'OR', 'Lakewille', '9740110011', '1122 10th_St'), 
('AK001', 'Animal', 'Kingdom', '208 555 7108', '', '2', 'ID', 'Borderville', '834835646', '15 Marlin Lane'); 

CREATE TABLE IF NOT EXISTS `Pet` (
    `ID` varchar(50) NOT NULL, 
    `CustomerID` varchar(50) NOT NULL, 
    `Gender` varchar(20) DEFAULT NULL, 
    `Race` varchar(20) DEFAULT NULL, 
    `Name` varchar(20) DEFAULT NULL, 
    `Kind` varchar(20) DEFAULT NULL, 
    `Birthday` varchar(20) DEFAULT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

-- Dumping data for table `Pet` 

INSERT INTO `Pet` (`ID`, `CustomerID`, `Gender`, `Race`, `Name`, `Kind`, `Birthday`) VALUES 
('AC001-01', '0', 'M', 'Long Ear', 'Bobo', 'Rabbit', '4/8/92'), 
('AC001-02', '0', 'F', 'Chameleon', 'Presto Chango', 'Lizard', '5/1/92'), 
('AC001-03', '0', 'M', '', 'Stinky', 'Skunk', '8/1/91'), 
('AC001-04', '0', 'M', 'German Shepherd', 'Fido', 'Dog', '6/1/90'), 
('AD001-01', '0', 'F', 'Potbelly', 'Patty', 'Pig', '2/15/91'), 
('AD001-02', '0', 'M', 'Palomino', 'Rising Sun', 'Horse', '4/10/90'), 
('AD002-01', '0', 'F', 'Mixed', 'Dee Dee', 'Dog', '2/15/91'), 
('AK001-03', '0', 'M', '', 'Jerry', 'Rat', '2/1/88'), 
('AK001-07', '0', 'M', 'Beagle', 'Luigi', 'Dog', '8/1/92'); 

這是我一直在用添加的外鍵代碼:

ALTER TABLE Pet ADD CONSTRAINT Pet_FK 
FOREIGN KEY (CustomerID) REFERENCES Customers (CustomerID); 

而從這個錯誤消息:

#1452 - Cannot add or update a child row: a foreign key constraint fails  
(`hospital`.`#sql-523_76e`, CONSTRAINT `Pet_FK` FOREIGN KEY (`CustomerID`) 
REFERENCES `Customers` (`CustomerID`)) 

我與不少初學者數據庫,我不知道我應該嘗試下一步。

我認爲就是這樣。林仍然是新的這個計算器,所以如果我錯過了任何必要的信息,請告訴我,我會加入它。

UPDATE ***

ALTER TABLE Customers ADD CONSTRAINT Customers_FK 
FOREIGN KEY (CustomerID) REFERENCES Pet (CustomerID); 

我換一些位置和錯誤代碼,我收到的是:

#1215 - Cannot add foreign key constraint 

回答

1

簡單。

有一行包含無法匹配的CustomerID。所以首先你需要刪除/編輯/處理條目並添加一個外鍵。

+0

它是行的順序是重要的還是拼寫。我一直在嘗試不同的組合和秩序的rowname,但仍然是錯誤的。首先, – Winterwind

+1

:時髦的** CustomerID **列名是什麼?刪除星號**!第二:你沒有在Pet表中插入有效的CustomerID,你插入的是全零。你應該插入有效的客戶ID,例如AC001,AD001等。 – enterx

+0

哦,我試着用粗體文本來標記我在文中提到的那一行。那些不會在那裏存在 – Winterwind

0

您試圖在PETS表中輸入CustomerID表,CUSTOMERS表中不存在,這就是您的外鍵約束失敗並拋出錯誤的原因。

你需要確保你在你的Pets表進入CustomerIDs,存在於Customers表或者乾脆在PETS.CUSTOMERID領域

+0

請讓我知道downvote的原因。我想了解我的回覆中出現了什麼問題 – Incognito

0

ENTERX是正確插入NULL

爲了能夠檢測不匹配的行:

SELECT * FROM Pet p WHERE (SELECT COUNT(*) FROM Customers c WHERE c.CustomerID=p.CustomerID)=0

只要改變SELECT *通過DELETE刪除missmatching寵物進入。 您也可以將Pet.CustomerID更新爲NULL。但是你要定義客戶ID,從寵物表,用NULL選項(而不是NOT NULL)

0

試試這個

CREATE TABLE IF NOT EXISTS `Pet` (
    `ID` varchar(50) NOT NULL, 
    FOREIGN KEY (`CustomerID`) REFERENCES Customers(CustomerID) varchar(50) NOT NULL, 
    `Gender` varchar(20) DEFAULT NULL, 
    `Race` varchar(20) DEFAULT NULL, 
    `Name` varchar(20) DEFAULT NULL, 
    `Kind` varchar(20) DEFAULT NULL, 
    `Birthday` varchar(20) DEFAULT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
+0

不,它沒有工作。 – Winterwind

0

看起來對我說,你的時候就應該插入表中的寵物的列ID值已被插入CustomerID,反之亦然。

順便說一下,將ID作爲VARCHAR使用並不是很好,特別是當它們是外鍵時。這使得查詢處理速度變慢,儘管你的表看起來並不像它們會有大量的行來改變它。無論如何,這只是一個觀察。我會考慮在我的表中使用人造int主鍵。

編輯

我看錯表寵物的價值觀。這裏的其他答案是正確的。您需要更新CustomerID列中的那些0值以匹配Customer表中的現有CustomerID或將其刪除,否則嘗試創建FK時會出錯。