2016-12-16 17 views
0

シナリオ:外部キーをドロップできないのはなぜですか?

Parent table | id primary key, message_p 
Child table | id primary key, parent_id foreign key, message_c 

Iは、子テーブルに親テーブル及びデータの2行のデータの1行を有していました。私は、FK関係が強制する制約をテストしたかったのです。私は、子テーブルは2行を持っていたことeveneかかわらず、私はその後、先に行くと、親行を削除することができるように、子テーブルから外部キーを削除しようとしました:

alter table child 
drop foreign key parent_id 

私は次のエラーを得た:

[1091 - Can't DROP 'parent_id'; check that column/key exists]

注:

show create table child 

CREATE TABLE `track` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`member_id` int(11) NOT NULL, 
`title` varchar(50) DEFAULT NULL, 
`artist` varchar(50) DEFAULT 'TBA', 
`album` varchar(50) DEFAULT 'TBA', 
`genre` varchar(50) DEFAULT 'TBA', 
`dance_style` varchar(50) DEFAULT 'TBA', 
PRIMARY KEY (`id`), 
KEY `member_id` (`member_id`), 
CONSTRAINT `track_ibfk_1` FOREIGN KEY (`member_id`) REFERENCES `member` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

私はFKのについての私のクエリまたは一般的な理解で何かが足りないのですか?

+0

外部キー名ではなく、列名で外部キーを削除しようとしているようです。 –

+0

また、 'show create table child'は' track'テーブルを表示しています。正しいコードを貼り付けたことを確認してください。 –

+0

しかし、そのテーブルでは、制約名は 'track_ibfk_1'です。あなたの 'child'テーブルでも同じことが起こりますので、外部キー名ではなく、カラム名で外部キーを削除しようとしています。 –

答えて

0

外部キー制約を列名で削除しようとしているため、コードが機能しません。

まずクエリあなたの外部キー制約名(キー名を示したようにコメントとしてあなたは()...、正しいテーブル名、制約名を想定し、すべてを試してみた場合、track_ibfk_1

0

のようなものをshow create table childを使用して、私はそれが動作しない理由を見ない。

お持ちの場合は、親(または「メンバー」)への外部キーを保持するが、他のテーブル、多分これらの制約は、親エントリの削除をブロックすること?

とにかくここでは、外部キーの動作を落とす例を示しますllyの動作:

drop table if exists testchild; 
drop table if exists test; 

create table test(
id int primary key, 
name varchar(50) 
); 

create table testchild(
childid int primary key, 
reftotest int, 
constraint reftotest_FK foreign key (reftotest) references test(id) 
); 

insert into test values (1, 'Jack'), (2, 'Sam'); 
insert into testchild values (1, 1), (2, 2), (3, 1); 

insert into testchild values (4,5); # will fail 
delete from test where id = 1; # will fail 

alter table testchild drop foreign key reftotest_FK; 
insert into testchild values (4,5); # will not fail any more 
delete from test where id = 1; # will not fail any more 
関連する問題