2017-04-26 5 views
1

外部キーについてグーグルで調べたところ、これは私がそれらを理解した方法です。SQLの外部キーの使い方

電話を保存する必要がある場合は、アドレスのあるテーブルに人がいない場合、複数の番号を持つことができるため、1人の人物に対して複数のレコードが作成されます。各繰り返し行に冗長アドレス値も格納されます。 user-idを外部キーとして使用すると、別のテーブルに電話することはできず、アドレスが繰り返されるのを防ぐことができます。だから私の質問は、ユーザーが住所付きのユーザーテーブルから削除された場合、自動的に電話テーブルの関連値もすべて削除されますか?または、これを削除するとテーブルが削除されるというテーブルの作成時に指定する必要がありますか? user-idが最初のテーブルでのみ変更され、2番目のテーブルだけでuser-idが変更された場合はどうなりますか。

私はまた、2つのテーブル

table: user 
+-----------------------------+ 
|user-id | username | address | 
+-----------------------------+ 

    table: phone-no 
+--------------------------+ 
| pid | phone-no | user-id | 
+--------------------------- 

を持っている場合、それはあまりでない場合、あなたは私の外部キーでこれの両方を作成するためのクエリを表示することができます。

+0

一貫した命名規則があります。たとえば、user_idとphone_id、またはuidとpid。ダッシュを避けてください。 – jarlh

答えて

0

テーブルuserのユーザIDがプライマリキーになり、テーブルphone-noのユーザIDがユーザテーブルのユーザIDを参照するforeginキーになります。

create table user(
    userid int identity(1,1) not null primary key, 
    username varchar(50) not null, 
    adress varchar(200) not null, 
); 

    create table phone-no(
    pid int identity(1,1) not null primary key, 
    phone-no int not null, 
    user-id int not null foreign key (userid) references user(userid) on delete cascade, 
); 

削除時にカスケードオプションは省略可能ですが、その意味を理解していただければ幸いです。

+0

削除カスケードについて言及していない場合、最初のテーブルからユーザーを削除すると、2番目のテーブルのレコードは削除されませんか? –

0

あなたのデザインは正しいです。外部キー構文についてHere's MySQLのマニュアルには、あなたのテーブルのために、それはこのようなものになります。ここでは

CONSTRAINT fk_user_id FOREIGN KEY (user-id) 
REFERENCES user(user-id) 
ON DELETE CASCADE 

を、ON DELETE CASCADEは、ユーザーが削除されたときに、電話機レコードが削除されることを確認します。別の操作(たとえば、user-idにnullを設定し、レコードを削除しない)を実行する場合は、​​を使用できます。上記のドキュメントの参照処置セクションをご覧ください。

+0

ユーザテーブルのuser-idを編集するとどうなりますか?電話もテーブルも更新されませんか? –

+0

'phone'テーブルに子レコードが存在する場合、ユーザIDを編集することはできません。 –

+0

ああ、クエリはエラーを返しますか?これは私の終わりに問題を保存します。 –