0

2 つのテーブルを作成し、次のことを行いました。

表1:(学生)

CREATE TABLE student(s int, n int, d int, PRIMARY KEY(s), FOREIGN KEY(d) REFERENCES dep(d));

表 2: (dep)

CREATE TABLE dep(d int, n int, PRIMARY KEY(d));

ですから、私の理解が正しければ、d はテーブル 1 の外部キーであり、部門の主キーを参照しています。したがって、 dep の主キーは、学生の d と一致する必要があります。ただし、次のことを行うと

INSERT INTO dep (1,2);

ステートメントはエラーなしで終了しましたか? 学生テーブルは空です。主キーが参照されている場合、どのようにデータを挿入できますか?

助けてください、ありがとう。

ちなみに、対応する値がない dep でも学生に自由に挿入できました。mysql と oracle のせいだと思いますか?

mysql> select * from student;
+---+------+------+
| s | n    | d    |
+---+------+------+
| 5 |    5 | 5    |
+---+------+------+
1 row in set (0.00 sec)

mysql> select * from dep;
+---+------+
| d | n    |
+---+------+
| 1 |    2 |
+---+------+
1 row in set (0.00 sec)
4

4 に答える 4

2

student テーブルには、dep テーブルの主キーである外部キー d があります。Student テーブルは dep テーブルに依存するテーブルです。dep テーブルには、student テーブルへのそのような依存関係はありません。制約は、常に dep テーブルにある必要がある d の値を持つという学生テーブルにあります。

d の値が無効なレコードを Student テーブルに挿入すると、エラーが発生します。

于 2012-04-13T04:11:12.077 に答える
2

あなたは理解を間違った方向に持っています。SQLで行ったことは、を入力するときにStudent、の値が値dとして存在する必要があることを確認することですdep.d

あなたが言ったら

insert into student values (1, 2, 3)

depd等しい行がない場合、これは失敗します3

于 2012-04-13T04:12:01.400 に答える
1

department このテーブルには制約がないため、テーブルに挿入できます。

部門テーブルに存在しないランダムな部門番号を持つ学生テーブルに行を追加しようとすると、制約エラーが発生します。

例:やってみるなら

insert into student values (1, 4, 1034);

また、部門テーブルに主キーの値を持つ行がない場合は1034、外部キー制約が与えられます。

あなたがする必要があるのは、親から下に向かってデータを挿入することです。

実際に別の方法でデータを削除する必要がある場合は、親注文レコードを削除する前にアイテムを削除してください。

于 2012-04-13T04:12:09.823 に答える
0

いつものように、詳細テーブルにデータを挿入し、マスターテーブルに対応する値がない場合、エラーが発生します-'子行を追加または更新できません:外部キー制約が失敗します...'。

ただし、FOREIGN_KEY_CHECKS変数が0に設定されている場合、MySQLは外部キー制約を無視します-

SET FOREIGN_KEY_CHECKS=0;
INSERT INTO student VALUES (5,5,5); -- no errors
SET FOREIGN_KEY_CHECKS=1;
于 2012-04-13T05:44:18.260 に答える