MySQL Help Can't delete row (errno: 150) foreign key constraint
Uppon trying to delete a record in one of my tables I got the following.
#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`))
So I did some research, looks like I have some messed up foreign keys. I tried to remove the key but then I got this.
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)
Did some more research and decided to do a SHOW INNODB STATUS
to get the LATEST FOREIGN KEY ERROR
which came out to be:
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.
And that's as far as I can get. I'm not that great with MySQL dbs yet and definitely get hung up on when it comes to foreign keys. Can someone help?
It looks like the two tables involved are plans
and plan_options
. Both of which structures are below:
--
-- 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`);
The foreign key is on the plan
table, so you would want to drop it form there:
ALTER TABLE `plans` DROP FOREIGN KEY `FK_plans`
But be aware that this key (and the fact that it's stopping you) might be a desirable thing. The reason it is there is to prevent options from getting into the plan_options
table which aren't associated with a plan. As such, you might want to delete from both tables when deleting:
DELETE FROM plans, plan_options
WHERE plan_id = ?
精彩评论