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

如果是,在当前状态下,根据我数据库中当前拥有的所有数据,我怎样才能取消它并在没有错误的情况下翻转它?

有关当前结构的更多信息:

因此,为了确定起见,请遵循以下简短说明: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;