2017-11-26 4 views
1

外部キーがそれ自体のテーブルにある場合、どのように最初の挿入問題を処理するか。私は、MySQLでのテーブルのコースを初期化することができますどのように外部キーがそれ自体である場合

/*外键是自己本身该如何处理插入问题*/ 
    create table if not exists Course(
    Cno varchar(10) primary key, 
    Cname varchar(100) not null, 
    Cpno varchar(10), 
    Ccredit tinyint, 

    foreign key (cpno) references course(cno) 
); 
/* the under sql will across error */ 
insert into Course(cno,cname,cpno,ccredit) value("1","数据库","5",4); 
insert into Course(cno,cname,cpno,ccredit) value("2","数学",null,2); 
insert into Course(cno,cname,cpno,ccredit) value("3","信息系统","1",4); 
insert into Course(cno,cname,cpno,ccredit) value("4","操作系统","6",3); 
insert into Course(cno,cname,cpno,ccredit) value("5","数据结构","7",4); 
insert into Course(cno,cname,cpno,ccredit) value("6","数据处理",null,2); 
insert into Course(cno,cname,cpno,ccredit) value("7","PASCAL语言","6",4); 

enter image description here

答えて

0

あなたの最初INSERTこのです:

insert into Course(cno,cname,cpno,ccredit) value("1","数据库","5",4); 

これは、外部キー(FK)として定義された列の値5と行を作成しようとするが、5cno値と、その行を確保することなくもう存在している。したがって、FK制約は挿入を拒否します。

これは3つの方法のいずれかで修正できます。

最初に、cpnoを参照して使用する前に、cnoの値が存在することを保証する順序で行を挿入します。

2, 6, 7, 5, 1, 3, 4 
ルート行(ヌル cpno値を持つ行)から始まるグラフトラバーサルアルゴリズムと順位をうまく

:私は、これはなると思います。

次に、挿入前にこのコマンドをSET FOREIGN_KEY_CHECKS=0;に入力して、外部キーのチェックをオフにしてみてください。挿入後にこのコマンドを入力して、検査を再度有効にします。 SET FOREIGN_KEY_CHECKS=1;

第3に、挿入を実行する前にテーブルから外部キー制約を削除します。それが終わったらもう一度追加してください。

第2の2つの方法は、通常、静かなシステムで行うバルク挿入操作にのみ適用されます。データ保全性保証の価値があるため、本番環境での外部キー検査を無効にしたくないことはおそらくあります。

これをお読みください。 How to temporarily disable a foreign key constraint in MySQL?

関連する問題