添加外键错误

时间:2014-02-21 12:51:59

标签: mysql sql database

我想将表格Customersrow= "Customer ID"中的外键添加到表格宠物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`))

我是数据库的初学者,我不知道接下来应该尝试什么。

我认为就是这样。我仍然是这个stackoverflow的新手,所以如果我错过了任何必要的信息,请告诉我,我会添加它。

UPDATE ***

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

我交换了一些职位,我收到的错误代码是:

#1215 - Cannot add foreign key constraint

5 个答案:

答案 0 :(得分:1)

简单。

有一行包含无法匹配的CustomerID。首先,您需要删除/编辑/处理条目,然后添加外键。

答案 1 :(得分:0)

您尝试在CustomerID表中输入的PETSCUSTOMERS表中不存在,这就是您的外键约束失败并抛出错误的原因。

您需要确保您在Pets表格中输入的客户ID存在于Customers表中,或者只需在NULL字段中插入PETS.CUSTOMERID

答案 2 :(得分:0)

Enterx是对的。

能够检测到不匹配的行:

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

只需更改SELECT * by DELETE即可删除不匹配的Pet条目。 您也可以将Pet.CustomerID更新为NULL。但是你必须从Pet表中定义CustomerID,使用NULL选项(而不是NOT NULL)

答案 3 :(得分: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;

答案 4 :(得分:0)

我觉得您在表格Pet ID中插入了值CustomerID时插入值,反之亦然。

顺便说一句,将ID设置为VARCHAR并不是很好,特别是当它们是外键时。这会使查询处理速度变慢,尽管您的表看起来不像它们会有大量的行来实现这一点。无论如何,这只是一个观察。我会考虑在我的表中使用artificial int主键。

修改

我误读了表Pet的价值观。这里的其他答案是正确的。您需要更新CustomerID列中的0值以匹配Customer表中的现有CustomerID或删除它们,否则在尝试创建FK时会出错。