2012-01-07 40 views
1

誰かが私を助けてくれるかどうか疑問に思う。MySQL削除カスケード

「ユーザーの詳細」テーブルからユーザーを削除すると、自分のデータベース内の他のテーブルからレコードが削除されるように、「カスケード削除」mySQL機能を使用したいと考えています。

私はStackoverflowのいくつかの記事を読んだ後、私がインターネットで行った研究からテーブルをInnoDBに変更し、既存のテーブルを変更し始めました。

私は私の最初のテーブルに「DELETE CASCADE外部キー」を追加し、私は、他のテーブルに同じことをしようとすると、私は次のエラー受け取ることができました:

#1005 - Can't create table './db369054642/#sql-30d_bd1a57.frm' (errno: 121) 

をしかし、なぜ私はこのエラーを受けているのか分かりません。なぜなら、最初に変更したテーブルが問題なく動作したからです。

親テーブルを1つの子テーブルにのみリンクすることはできますか?

親表(ユーザ詳細)

DROP TABLE IF EXISTS `userdetails`; 
CREATE TABLE IF NOT EXISTS `userdetails` (
    `userid` int(6) NOT NULL auto_increment, 
    `forename` varchar(20) NOT NULL, 
    `surname` varchar(30) NOT NULL, 
    `emailaddress` varchar(150) NOT NULL, 
    `password` varchar(200) NOT NULL, 
    `passwordhint` varchar(20) NOT NULL, 
    `subscriptionexpiration` date NOT NULL, 
    `salt` varchar(200) NOT NULL, 
    PRIMARY KEY (`userid`), 
    UNIQUE KEY `emailaddress` (`emailaddress`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

子テーブル(検出器)

DROP TABLE IF EXISTS `detectors`; 
CREATE TABLE IF NOT EXISTS `detectors` (
    `userid` int(6) NOT NULL, 
    `detectorid` int(6) NOT NULL auto_increment, 
    `detectorname` varchar(30) NOT NULL, 
    PRIMARY KEY (`detectorid`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=0 AUTO_INCREMENT=1 ; 

カスケードSQLステートメント

ALTER TABLE detectors 
    add CONSTRAINT fk_userdetails 
    FOREIGN KEY (userid) 
    REFERENCES userdetails(userid) 
    ON DELETE CASCADE 
+0

などのフル表領域フル/ディスクなどの通常の容疑者は、私が思う、除外されていますか? –

+0

スキーマとクエリを投稿してください –

+0

Googleは常にエラーメッセージの最初の素晴らしいリソースです。私があなたのエラーを検索に差し込むと、私はこのフォーラムディスカッションを、他のいくつかのヒット - http://forums.mysql.com/read.php?22,33999,76181#msg-76181の中で取得します。問題のあるテーブル(ソースとターゲットの両方)に対して、 'SHOW CREATE TABLE * tableName *'を投稿してください。また、使用しようとしているSQLをソース表に変更してください。 – Perception

答えて

2
を削除

テーブルと参照テーブルの両方に、関連する列にというインデックスがありますか? http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.htmlから

InnoDB requires indexes on foreign keys and referenced keys so that foreign key checks can be fast and not require a table scan. In the referencing table, there must be an index where the foreign key columns are listed as the first columns in the same order. Such an index is created on the referencing table automatically if it does not exist. (This is in contrast to some older versions, in which indexes had to be created explicitly or the creation of foreign key constraints would fail.) index_name, if given, is used as described previously.

インデックスには名前の競合が存在しないとしている場合ので、我々は確認することができます最初に必要なインデックスを作成するようにしてください、またはSHOW CREATE TABLE yourTableNameから私たちの出力を示しています。

2

perrorユーティリティ(mysqlディストリビューションに含まれています)を見てください。エラーコードの詳細な説明が表示され、コマンドラインから実行されます。あなたは、コマンドラインでこれを実行すると思いますので、あなたの場合のエラー番号は、121です:

perror 121 

http://dev.mysql.com/doc/refman/5.0/en/perror.html

関連する問題