2011-08-24 54 views
2

Uppon試圖刪除我的表中的一條記錄我得到以下內容。MySQL幫助不能刪除行(errno:150)外鍵約束

#1451 - Cannot delete or update a parent row: a foreign key constraint fails (`pasremotedb`.`plans`, CONSTRAINT `FK_plans` FOREIGN KEY (`plan_id`) REFERENCES `plan_options` (`plan_id`)) 

所以我做了一些研究,看起來像我有一些搞砸外鍵。我試圖刪除密鑰,但後來我得到了這個。

mysql> ALTER TABLE `plan_options` DROP INDEX `plan_id`; 
ERROR 1025 (HY000): Error on rename of './pasremotedb/#sql-1c0f_31ea' to './pasremotedb/plan_options' (errno: 150) 

做了一些研究,決定做一個SHOW INNODB STATUS要獲取的出來是LATEST FOREIGN KEY ERROR

110824 15:07:33 Error in foreign key constraint of table pasremotedb/plans: 
there is no index in referenced table which would contain 
the columns as the first columns, or the data types in the 
referenced table do not match the ones in table. Constraint: 
, 
    CONSTRAINT "FK_plans" FOREIGN KEY ("plan_id") REFERENCES "plan_options" ("plan_id") 
The index in the foreign key in table is "PRIMARY" 
See http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html 
for correct foreign key definition. 

這就是據我可以得到的。我對MySQL dbs還不是很瞭解,而且當涉及到外鍵時肯定會掛斷。有人可以幫忙嗎?

它看起來像涉及的兩個表是plansplan_options。這兩者的結構如下:

-- 
-- Table structure for table `plan_options` 
-- 

CREATE TABLE IF NOT EXISTS `plan_options` (
    `account_id` int(11) NOT NULL, 
    `plan_id` tinyint(1) NOT NULL, 
    `discipline_id` int(2) NOT NULL, 
    `practice_type_id` int(1) NOT NULL, 
    `discipline_other` varchar(100) NOT NULL, 
    PRIMARY KEY (`account_id`), 
    KEY `plan_id` (`plan_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

-- 
-- Dumping data for table `plan_options` 
-- 

INSERT INTO `plan_options` (`account_id`, `plan_id`, `discipline_id`, `practice_type_id`, `discipline_other`) VALUES 
(1, 3, 5, 1, ''), 
(2, 2, 3, 1, ''), 
(3, 1, 6, 1, ''), 
(4, 2, 1, 2, ''), 
(5, 3, 1, 1, ''), 
(6, 2, 5, 1, ''), 
(7, 2, 3, 1, ''), 
(12, 2, 7, 2, 'MD'), 
(13, 1, 2, 2, ''), 
(14, 3, 1, 2, ''), 
(16, 1, 1, 2, ''), 
(18, 2, 7, 1, 'AMA Guides'), 
(21, 2, 5, 1, ''); 

-- 
-- Constraints for dumped tables 
-- 

-- 
-- Constraints for table `plan_options` 
-- 
ALTER TABLE `plan_options` 
    ADD CONSTRAINT `FK_plan_options` FOREIGN KEY (`account_id`) REFERENCES `account_details` (`account_id`); 
-- 
-- Table structure for table `plans` 
-- 

CREATE TABLE IF NOT EXISTS `plans` (
    `plan_id` tinyint(1) NOT NULL AUTO_INCREMENT, 
    `plan_name` varchar(50) NOT NULL, 
    PRIMARY KEY (`plan_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ; 

-- 
-- Dumping data for table `plans` 
-- 

INSERT INTO `plans` (`plan_id`, `plan_name`) VALUES 
(1, 'Gold'), 
(2, 'Platinum'), 
(3, 'Supremacy'); 

-- 
-- Constraints for dumped tables 
-- 

-- 
-- Constraints for table `plans` 
-- 
ALTER TABLE `plans` 
    ADD CONSTRAINT `FK_plans` FOREIGN KEY (`plan_id`) REFERENCES `plan_options` (`plan_id`); 

回答

2

的外鍵是在​​表,so you would want to drop it form there

ALTER TABLE `plans` DROP FOREIGN KEY `FK_plans` 

但要注意,這個鍵(事實上,它阻止你)可能是一個理想的事情。其原因是爲了防止選項進入與計劃無關的plan_options表。因此,您可能要刪除兩個表刪除時:

DELETE FROM plans, plan_options 
    WHERE plan_id = ?