MySQL Help无法删除行(errno:150)外键约束

时间:2011-08-24 22:25:45

标签: mysql foreign-keys

Uppon试图删除我的一个表中的记录,我得到了以下内容。

#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`);

1 个答案:

答案 0 :(得分:2)

外键位于plan表格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 = ?