Delete row from table:"Cannot delete or update a parent row:a foreign key constraint fails" 是 FOREIGN KEY 问题还是 CASCADE 会完成这项工作?
Delete row from table:"Cannot delete or update a parent row:a foreign key constraint fails" is that a FOREIGN KEY problemm or CASCADE will do the job?
我想从 "prods" table 中删除一行。每当我删除一行时,我都希望它从与其关联的其他 table 中删除行。
每当我尝试使用我的 PHP 代码从 "prods" 中删除一行时 - 我收到此错误:
A Database Error Occurred
Error Number: 1451
Cannot delete or update a parent row: a foreign key constraint fails (`tools`.`keywords`, CONSTRAINT `keywords_ibfk_1` FOREIGN KEY (`key_prod`) REFERENCES `prods` (`prod_id`))
我对 'keywords' table 也一样 - 这是通过删除 "data" table 中 "related" 的行解决的,只是然后 - 从 'keywords' table.
中删除行
但是当我从 'prods' table 中删除一行时再次遇到这个问题时 - 我注意到这不能像这样工作并且必须有更有效的方法来做这个。
谷歌搜索了一下后,我发现我可以使用 "DELETE Cascade" - 它可能会导致问题(或删除不需要的行)。我真的不知道它是否会 - 所以我对此进行了更多的研究。根据其他搜索结果,我发现了这个 post:
Cannot delete or update a parent row: a foreign key constraint fails
这家伙被告知 FOREIGN KEY 没有正确完成 - 他必须在它们之间交换,这将解决他的问题。
我是处理复杂数据库的新手,我想知道我这样做是否正确 - 所有外键都正确完成,如果我使用 DELETE CASCADE
就可以正确完成工作。
这是我的数据库转储结构 (MySQL):
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
-- Table structure for table `prods`
--
CREATE TABLE `prods` (
`prod_id` int(11) NOT NULL,
`prod_name` varchar(255) NOT NULL,
`prod_aaa_id` varchar(255) NOT NULL,
`prod_bbb_id` varchar(255) NOT NULL,
`prod_get_installs` tinyint(1) NOT NULL,
`prod_user` int(11) NOT NULL,
`prod_client_email` varchar(255) NOT NULL,
`prod_client_name` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `prod_data`
--
CREATE TABLE `prod_data` (
`ad_id` int(11) NOT NULL,
`ad_prod` int(11) NOT NULL,
`ad_date` date NOT NULL,
`ad_aaa_inst` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `data`
--
CREATE TABLE `data` (
`id` int(11) NOT NULL,
`dat_id` int(11) NOT NULL,
`dat_date` date NOT NULL,
`dat_rank_aaa` int(11) NOT NULL,
`dat_traffic_aaa` float NOT NULL,
`dat_rank_bbb` int(11) NOT NULL,
`dat_traffic_bbb` float NOT NULL,
`dat_difficulty_aaa` float NOT NULL,
`dat_difficulty_bbb` float NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `keywords`
--
CREATE TABLE `keywords` (
`key_id` int(11) NOT NULL,
`key_word` varchar(255) NOT NULL,
`key_prod` int(11) NOT NULL,
`kay_country` text NOT NULL,
`key_is_wr` tinyint(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `users`
--
CREATE TABLE `users` (
`u_id` int(11) NOT NULL,
`u_name` varchar(255) NOT NULL,
`u_email` varchar(255) NOT NULL,
`u_password` varchar(255) NOT NULL,
`u_permission` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `weekly_report`
--
CREATE TABLE `weekly_report` (
`wr_id` int(11) NOT NULL,
`wr_prod_id` int(11) NOT NULL,
`wr_date` date NOT NULL,
`wr_date1` date NOT NULL,
`wr_date2` date NOT NULL,
`wr_date3` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Indexes for dumped tables
--
--
-- Indexes for table `prods`
--
ALTER TABLE `prods`
ADD PRIMARY KEY (`prod_id`),
ADD KEY `prod_user` (`prod_user`),
ADD KEY `prod_user_2` (`prod_user`);
--
-- Indexes for table `prod_data`
--
ALTER TABLE `prod_data`
ADD PRIMARY KEY (`ad_id`),
ADD KEY `ad_prod` (`ad_prod`);
--
-- Indexes for table `data`
--
ALTER TABLE `data`
ADD PRIMARY KEY (`id`),
ADD KEY `dat_id` (`dat_id`);
--
-- Indexes for table `kas`
--
ALTER TABLE `kas`
ADD PRIMARY KEY (`kas_id`);
--
-- Indexes for table `keywords`
--
ALTER TABLE `keywords`
ADD PRIMARY KEY (`key_id`),
ADD KEY `key_prod` (`key_prod`);
--
-- Indexes for table `users`
--
ALTER TABLE `users`
ADD PRIMARY KEY (`u_id`),
ADD KEY `u_id` (`u_id`);
--
-- Indexes for table `weekly_report`
--
ALTER TABLE `weekly_report`
ADD PRIMARY KEY (`wr_id`),
ADD KEY `wr_prod_id` (`wr_prod_id`),
ADD KEY `wr_prod_id_2` (`wr_prod_id`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `prods`
--
ALTER TABLE `prods`
MODIFY `prod_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=23;
--
-- AUTO_INCREMENT for table `prod_data`
--
ALTER TABLE `prod_data`
MODIFY `ad_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=13;
--
-- AUTO_INCREMENT for table `data`
--
ALTER TABLE `data`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3754;
--
--
-- AUTO_INCREMENT for table `keywords`
--
ALTER TABLE `keywords`
MODIFY `key_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=236;
--
-- AUTO_INCREMENT for table `users`
--
ALTER TABLE `users`
MODIFY `u_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;
--
-- AUTO_INCREMENT for table `weekly_report`
--
ALTER TABLE `weekly_report`
MODIFY `wr_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;
--
-- Constraints for dumped tables
--
--
-- Constraints for table `prods`
--
ALTER TABLE `prods`
ADD CONSTRAINT `prods_ibfk_1` FOREIGN KEY (`prod_user`) REFERENCES `users` (`u_id`);
--
-- Constraints for table `data`
--
ALTER TABLE `data`
ADD CONSTRAINT `data_ibfk_1` FOREIGN KEY (`dat_id`) REFERENCES `keywords` (`key_id`);
--
-- Constraints for table `keywords`
--
ALTER TABLE `keywords`
ADD CONSTRAINT `keywords_ibfk_1` FOREIGN KEY (`key_prod`) REFERENCES `prods` (`prod_id`);
--
-- Constraints for table `weekly_report`
--
ALTER TABLE `weekly_report`
ADD CONSTRAINT `weekly_report_ibfk_1` FOREIGN KEY (`wr_prod_id`) REFERENCES `prods` (`prod_id`);
请问FOREIGN KEY是否做对了?我应该改变我的结构吗?
"CASCADE" 在这种情况下可以正常工作吗?
非常感谢。
编辑:
这是导致所有问题的原因吗?
ALTER TABLE `keywords`
ADD CONSTRAINT `keywords_ibfk_1` FOREIGN KEY (`key_prod`) REFERENCES `prods` (`prod_id`);
如果是,在当前状态下,根据我数据库中当前拥有的所有数据,我怎样才能取消它并在没有错误的情况下翻转它?
有关当前结构的更多信息:
- 每个 'prod' 都有超过 1 个关键字 ('keywords' table)。
- 每个 'keyword' 都有不止一个 'data' 行。
- 每个'prod'只有一个用户。
- 每个'prod'都有不止一个'prod_data'。
因此,为了确定起见,请遵循以下简短说明:http://www.w3schools.com/sql/sql_foreignkey.asp
'key_prod'显然是"keywords"中的FOREIGN KEY table,'prod_id'是"prods"中的"PRIMARY KEY" table。
我现在很迷茫
编辑#2:
这是我找到的另一个解决方案,不太确定如何在我的代码中应用它,但无论如何:
The simple way would be to disable the foreign key check; make the
changes then re-enable foreign key check.
SET FOREIGN_KEY_CHECKS=0; -- to disable them
SET FOREIGN_KEY_CHECKS=1; -- to re-enable them
我不确定它是否是一种变通方法,或者是针对此类问题的真正解决方案,我真的希望我的代码能够正常工作 "by the book" 尤其是当我不熟悉此类问题时东西。
我曾参与过类似的数据库项目。首先备份你的数据库。
尝试删除外键。
ALTER TABLE table_name DROP FOREIGN KEY column_name_ibfk_1;
之后,您现在可以创建一个可以执行上述行为的外键。
ALTER TABLE table_name ADD FOREIGN KEY(column_name) REFERENCES table_name(column_name) ON DELETE CASCADE ON UPDATE CASCADE;
我想从 "prods" table 中删除一行。每当我删除一行时,我都希望它从与其关联的其他 table 中删除行。
每当我尝试使用我的 PHP 代码从 "prods" 中删除一行时 - 我收到此错误:
A Database Error Occurred
Error Number: 1451
Cannot delete or update a parent row: a foreign key constraint fails (`tools`.`keywords`, CONSTRAINT `keywords_ibfk_1` FOREIGN KEY (`key_prod`) REFERENCES `prods` (`prod_id`))
我对 'keywords' table 也一样 - 这是通过删除 "data" table 中 "related" 的行解决的,只是然后 - 从 'keywords' table.
中删除行但是当我从 'prods' table 中删除一行时再次遇到这个问题时 - 我注意到这不能像这样工作并且必须有更有效的方法来做这个。
谷歌搜索了一下后,我发现我可以使用 "DELETE Cascade" - 它可能会导致问题(或删除不需要的行)。我真的不知道它是否会 - 所以我对此进行了更多的研究。根据其他搜索结果,我发现了这个 post:
Cannot delete or update a parent row: a foreign key constraint fails
这家伙被告知 FOREIGN KEY 没有正确完成 - 他必须在它们之间交换,这将解决他的问题。
我是处理复杂数据库的新手,我想知道我这样做是否正确 - 所有外键都正确完成,如果我使用 DELETE CASCADE
就可以正确完成工作。
这是我的数据库转储结构 (MySQL):
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
-- Table structure for table `prods`
--
CREATE TABLE `prods` (
`prod_id` int(11) NOT NULL,
`prod_name` varchar(255) NOT NULL,
`prod_aaa_id` varchar(255) NOT NULL,
`prod_bbb_id` varchar(255) NOT NULL,
`prod_get_installs` tinyint(1) NOT NULL,
`prod_user` int(11) NOT NULL,
`prod_client_email` varchar(255) NOT NULL,
`prod_client_name` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `prod_data`
--
CREATE TABLE `prod_data` (
`ad_id` int(11) NOT NULL,
`ad_prod` int(11) NOT NULL,
`ad_date` date NOT NULL,
`ad_aaa_inst` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `data`
--
CREATE TABLE `data` (
`id` int(11) NOT NULL,
`dat_id` int(11) NOT NULL,
`dat_date` date NOT NULL,
`dat_rank_aaa` int(11) NOT NULL,
`dat_traffic_aaa` float NOT NULL,
`dat_rank_bbb` int(11) NOT NULL,
`dat_traffic_bbb` float NOT NULL,
`dat_difficulty_aaa` float NOT NULL,
`dat_difficulty_bbb` float NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `keywords`
--
CREATE TABLE `keywords` (
`key_id` int(11) NOT NULL,
`key_word` varchar(255) NOT NULL,
`key_prod` int(11) NOT NULL,
`kay_country` text NOT NULL,
`key_is_wr` tinyint(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `users`
--
CREATE TABLE `users` (
`u_id` int(11) NOT NULL,
`u_name` varchar(255) NOT NULL,
`u_email` varchar(255) NOT NULL,
`u_password` varchar(255) NOT NULL,
`u_permission` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `weekly_report`
--
CREATE TABLE `weekly_report` (
`wr_id` int(11) NOT NULL,
`wr_prod_id` int(11) NOT NULL,
`wr_date` date NOT NULL,
`wr_date1` date NOT NULL,
`wr_date2` date NOT NULL,
`wr_date3` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Indexes for dumped tables
--
--
-- Indexes for table `prods`
--
ALTER TABLE `prods`
ADD PRIMARY KEY (`prod_id`),
ADD KEY `prod_user` (`prod_user`),
ADD KEY `prod_user_2` (`prod_user`);
--
-- Indexes for table `prod_data`
--
ALTER TABLE `prod_data`
ADD PRIMARY KEY (`ad_id`),
ADD KEY `ad_prod` (`ad_prod`);
--
-- Indexes for table `data`
--
ALTER TABLE `data`
ADD PRIMARY KEY (`id`),
ADD KEY `dat_id` (`dat_id`);
--
-- Indexes for table `kas`
--
ALTER TABLE `kas`
ADD PRIMARY KEY (`kas_id`);
--
-- Indexes for table `keywords`
--
ALTER TABLE `keywords`
ADD PRIMARY KEY (`key_id`),
ADD KEY `key_prod` (`key_prod`);
--
-- Indexes for table `users`
--
ALTER TABLE `users`
ADD PRIMARY KEY (`u_id`),
ADD KEY `u_id` (`u_id`);
--
-- Indexes for table `weekly_report`
--
ALTER TABLE `weekly_report`
ADD PRIMARY KEY (`wr_id`),
ADD KEY `wr_prod_id` (`wr_prod_id`),
ADD KEY `wr_prod_id_2` (`wr_prod_id`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `prods`
--
ALTER TABLE `prods`
MODIFY `prod_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=23;
--
-- AUTO_INCREMENT for table `prod_data`
--
ALTER TABLE `prod_data`
MODIFY `ad_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=13;
--
-- AUTO_INCREMENT for table `data`
--
ALTER TABLE `data`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3754;
--
--
-- AUTO_INCREMENT for table `keywords`
--
ALTER TABLE `keywords`
MODIFY `key_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=236;
--
-- AUTO_INCREMENT for table `users`
--
ALTER TABLE `users`
MODIFY `u_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;
--
-- AUTO_INCREMENT for table `weekly_report`
--
ALTER TABLE `weekly_report`
MODIFY `wr_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;
--
-- Constraints for dumped tables
--
--
-- Constraints for table `prods`
--
ALTER TABLE `prods`
ADD CONSTRAINT `prods_ibfk_1` FOREIGN KEY (`prod_user`) REFERENCES `users` (`u_id`);
--
-- Constraints for table `data`
--
ALTER TABLE `data`
ADD CONSTRAINT `data_ibfk_1` FOREIGN KEY (`dat_id`) REFERENCES `keywords` (`key_id`);
--
-- Constraints for table `keywords`
--
ALTER TABLE `keywords`
ADD CONSTRAINT `keywords_ibfk_1` FOREIGN KEY (`key_prod`) REFERENCES `prods` (`prod_id`);
--
-- Constraints for table `weekly_report`
--
ALTER TABLE `weekly_report`
ADD CONSTRAINT `weekly_report_ibfk_1` FOREIGN KEY (`wr_prod_id`) REFERENCES `prods` (`prod_id`);
请问FOREIGN KEY是否做对了?我应该改变我的结构吗?
"CASCADE" 在这种情况下可以正常工作吗?
非常感谢。
编辑:
这是导致所有问题的原因吗?
ALTER TABLE `keywords`
ADD CONSTRAINT `keywords_ibfk_1` FOREIGN KEY (`key_prod`) REFERENCES `prods` (`prod_id`);
如果是,在当前状态下,根据我数据库中当前拥有的所有数据,我怎样才能取消它并在没有错误的情况下翻转它?
有关当前结构的更多信息:
- 每个 'prod' 都有超过 1 个关键字 ('keywords' table)。
- 每个 'keyword' 都有不止一个 'data' 行。
- 每个'prod'只有一个用户。
- 每个'prod'都有不止一个'prod_data'。
因此,为了确定起见,请遵循以下简短说明:http://www.w3schools.com/sql/sql_foreignkey.asp
'key_prod'显然是"keywords"中的FOREIGN KEY table,'prod_id'是"prods"中的"PRIMARY KEY" table。
我现在很迷茫
编辑#2:
这是我找到的另一个解决方案,不太确定如何在我的代码中应用它,但无论如何:
The simple way would be to disable the foreign key check; make the changes then re-enable foreign key check.
SET FOREIGN_KEY_CHECKS=0; -- to disable them SET FOREIGN_KEY_CHECKS=1; -- to re-enable them
我不确定它是否是一种变通方法,或者是针对此类问题的真正解决方案,我真的希望我的代码能够正常工作 "by the book" 尤其是当我不熟悉此类问题时东西。
我曾参与过类似的数据库项目。首先备份你的数据库。
尝试删除外键。
ALTER TABLE table_name DROP FOREIGN KEY column_name_ibfk_1;
之后,您现在可以创建一个可以执行上述行为的外键。
ALTER TABLE table_name ADD FOREIGN KEY(column_name) REFERENCES table_name(column_name) ON DELETE CASCADE ON UPDATE CASCADE;