2016-04-01 14 views
0

私はphp再帰関数を記述する必要はありません。削除カスケードのMySQL pk_idのremove parent_idを削除

私は記事とカテゴリのリストを生成するルックアップテーブルを持っていますが、それぞれ固有のID(nav_id)を持っています。子供の場合はparent_idです。ただし記事は親として使われることはありません。

だから私の考えは、CASCADE DELETEでした。これは違反になり続けます.parent_idはnullにはなりません。しかし、これが私がルートを特定する方法です。

SQL

CREATE TABLE IF NOT EXISTS `navigation` (
`nav_id` INT NOT NULL AUTO_INCREMENT COMMENT '', 
`parent_id` INT NULL COMMENT '', 
`article_id` INT NULL DEFAULT 0 COMMENT '', 
`category_id` INT NULL DEFAULT 0 COMMENT '', 
`position` TINYINT NULL COMMENT '', 
PRIMARY KEY (`nav_id`, `parent_id`) COMMENT '', 
UNIQUE INDEX `nav_id_UNIQUE` (`nav_id` ASC) COMMENT '', 
INDEX `rec1_idx` (`parent_id` ASC) COMMENT '', 
CONSTRAINT `rec1` 
FOREIGN KEY (`parent_id`) 
REFERENCES `navigation` (`nav_id`) 
ON DELETE CASCADE 
ON UPDATE NO ACTION) 
ENGINE = InnoDB 

しかしために結果を挿入します。

':parent_id' => null 
':article_id' => null 
':category_id' => 19 
':position' => 1 


INSERT INTO navigation (
parent_id,article_id,category_id,position 
) VALUES (
:parent_id,:article_id,:category_id,:position 
) 

Integrity constraint violation: 1048 Column 'parent_id' cannot be null

任意およびすべてのアイデアは歓迎されています。

テーブルの構造変更?外部キーの変更?

私はトリガを実行した後も同じテーブルからトリガを削除することはできません。

+0

を参照してください: //stackoverflow.com/questions/441988/mysql-foreign-key-to-allow-null – Maximus2012

+0

もう1つ:http://stackoverflow.com/questions/150828 74/null-value-to-foreign-key-fieldを渡す方法 – Maximus2012

+0

Nope。複数のテーブルのいずれか、または主キーnullで問題が発生しました。私は私のCREATE TABLE SQL DEFAULT parent_id = nullを変更し、PHPMyAdminのチェックボックスNull、同じ結果でそれを設定しました。制約を削除するとうまくいきますが、削除カスケードが必要です – Darcey

答えて

0

nullの値をparent_idに挿入することができません。これは主キーの一部です。以下を参照してください:

PRIMARY KEY (`nav_id`, `parent_id`) COMMENT '' 

プライマリキーの列にはnullの値を挿入できません。主キーからparent_idを削除すると、挿入が正常に機能します。ここにはSQL Fiddleです。ヌル挿入手当を修正するためのSQL表の作成上のダルシャンメータFROM

+0

ああ!それは挿入を修正しました... – Darcey

+0

親行を削除または更新できません:外部キー制約が失敗しました( 'navigation'、CONSTRAINT' rec1' FOREIGN KEY( 'parent_id')REFERENCES' navigation'( 'nav_id')) ' – Darcey

+0

PS。ニース私はSQLFiddleが存在していたのか分からなかった:) 私は今外国キーエラーをグーグルしている。 – Darcey

0

COMPLETE ANSWER

はPART 1

それはだからMySQLはPARENT_IDにNULL値を挿入することができますされていません主キーの一部以下を参照してください:

PRIMARY KEY (`nav_id`, `parent_id`) COMMENT '' 

PART 2

主な問題は、以下のSQLは完璧に動作し、 "カスケード削除" します。http:この場合に役立ちます

CREATE TABLE IF NOT EXISTS `navigation` (
`nav_id` INT NOT NULL AUTO_INCREMENT COMMENT '', 
`parent_id` INT NULL COMMENT '', 
`article_id` INT NULL DEFAULT 0 COMMENT '', 
`category_id` INT NULL DEFAULT 0 COMMENT '', 
`position` TINYINT NULL COMMENT '', 
PRIMARY KEY (`nav_id`) COMMENT '', 
UNIQUE INDEX `nav_id_UNIQUE` (`nav_id` ASC) COMMENT '', 
INDEX `rec1_idx` (`parent_id` ASC) COMMENT '', 
CONSTRAINT `rec1` 
FOREIGN KEY (`parent_id`) 
REFERENCES `navigation` (`nav_id`) 
ON DELETE CASCADE 
ON UPDATE NO ACTION 
); 

http://sqlfiddle.com/#!9/5026ee/1/0

関連する問題