2016-05-02 8 views
1

"prods"テーブルから行を削除します。行を削除するたびに、その行に関連する他のテーブルから行を削除します。テーブルからの行の削除:「親行を削除または更新できません:外部キー制約は失敗します」というのは、FOREIGN KEYの問題またはCASCADEがその作業を行うということですか?

私は私の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`)) 

私は「キーワード」テーブルと同じだ - これは、行を削除することで解決しましたそれらは「データ」テーブル内の「関連」であり、「キーワード」テーブルからその行を削除するだけです。

しかし、 'prods'テーブルから行を削除するときに再びこの問題が発生した場合、このように動作しないことに気付きました。これを行うにはもっと効率的な方法が必要です。

ちょっとグーグルで調べたところ、「DELETE Cascade」を使用することができ、問題を引き起こす(または不要な行を削除する)可能性があります。私は本当にそれが可能かどうかわからない - 私はこれをもう少し詳しく調べる。私はこの記事を発見した他の検索結果を、以下:男はFOREIGN KEYが正しく行われていなかったと言われた

Cannot delete or update a parent row: a foreign key constraint fails

- と彼は彼の問題を解決するであろう、それらの間で交換する必要があります。

私は複雑なデータベースを扱うのが初めてで、正しい方法を実行しているかどうかを知りたがっています。すべてのFOREIGN KEYが正しく行われていて、DELETE CASCADEを使用すると正しく機能します。

これは私のDBのダンプ構造(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`); 

あなたは私を教えていただけますか?私の構造で何かを変えるべきですか?

この場合、「CASCADE」は問題なく動作しますか?

ありがとうございます。

EDIT:

が、これはすべての問題を引き起こしているものですか?

ALTER TABLE `keywords` 
    ADD CONSTRAINT `keywords_ibfk_1` FOREIGN KEY (`key_prod`) REFERENCES `prods` (`prod_id`); 

はい場合は、この現在の状態では、私は現在、私のDBに持っているすべてのデータを、どのように私はこれを取り消すことができますし、エラーなしでそれを周りの反転?現在の構造について

詳細情報:

  • すべて 'PROD' 1つの以上のキーワード( 'キーワード' テーブル)を持っています。
  • すべての 'キーワード'には複数の 'データ'行があります。
  • すべての「prod」には1人のユーザーしかいません。
  • すべての 'prod'には複数の 'prod_data'があります。

だから確かであるために、この簡単な説明以下:http://www.w3schools.com/sql/sql_foreignkey.asp

「key_prodは」はっきり「キーワード」テーブルの外部キーである、と「PROD_IDは」内の「PRIMARY KEY」です"prods"テーブル。

私は今非常に混乱しています。

EDIT#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 

私はそれがだのかはわかりませんこの問題を解決するには本当の解決策であり、特に私がこの種のものを扱うのを初めて経験したときには、 "本で"コードを動作させたいと思っています。

答えて

2

私は同様のデータベースプロジェクトで作業していました。最初にデータベースをバックアップします。

外部キーを削除しようとします。

これで、前述の動作を行うことができる外部キーを作成できるようになりました。

ALTER TABLE table_name ADD FOREIGN KEY(column_name) REFERENCES table_name(column_name) ON DELETE CASCADE ON UPDATE CASCADE; 
+0

このようにしますか? これは実際にはメインの投稿に記載されているもののようですが、 ''コンストレイント? –

+0

2つの違いは何ですか?私はPHPMYADMINを使って自分のFOREIGN KEYを作成しました。なぜ違うのですか? –

+0

外部キーの制約は、phpmyadminを使用して作成するかCLIを使用して作成するかにかかわらず、ON DELETE CASCADE ON UPDATE CASCADEを追加することを除いて、違いはありません。外部キーを適切に作成した場合は、主キー・フィールドと外部キー・フィールドのデータ操作をどうするかを決めることができます。 phpmyadminを使用している場合は、外部キーを含むテーブルに移動します。 「構造」 - >「リレーショナル・ビュー」をクリックします。下へスクロール。そこで、外部キーを追加して、 "CASCADE"を決定することができます。 – byteHunt3r