2017-11-26 10 views
0

を参照していない、私は次の2つの表があります。SQL:外部キーが正しく

CREATE TABLE IF NOT EXISTS Doctor 
(
    ssn CHAR(11) PRIMARY KEY, 
    name CHAR(30), 
    specialty CHAR(30), 
    yearsOfExperience INTEGER 
); 

CREATE TABLE IF NOT EXISTS Pri_Phy_Patient 
(
    ssn CHAR(11) PRIMARY KEY, 
    name CHAR(20), 
    age INTEGER, 
    address CHAR(200), 
    phy_ssn CHAR(11), 
    FOREIGN KEY (phy_ssn) REFERENCES Doctor(ssn) 
); 

select * from doctorは、次の値を返します。

ssn  name  specialty yearsOfExperience 
------------------------------------------------- 
156188 Dr. Doctor Doctorism 12 
338738 Dr. Jim  Eyes  2 
4354354 Dr. Man  Legs  1 
453543 Dr. Woman Arms  5 

select * from pri_phy_patient戻り、この:

ssn  name age address       phy_ssn 
------------------------------------------------------------- 
1234134 Patrick 32 331 Patrickson Lane, Patton, CO NULL 
1234597 Patty 23 331 Patterson Dr, Pattington, IL NULL 
654643 Pamela 46 331 Pammerson Rd, Pammington, OR NULL 

のはなぜですphy_ssn列はの場合NULLに戻ります?私はphy_ssnDoctor(ssn)を参照しています。 phy_ssnコラムにすべての医師のSSNがあるはずはありませんか?

+0

phy_ssnはnullableです。つまり、Pri_Phy_Patientに行があり、Doctorに対応する行がありません。それがあなたが望むものでなければ、phy_ssnをNULLにしないでください。 –

+0

'' phy_ssn''をNOT NULL'とするとエラーが発生します: '' Error Code:1452.子行を追加または更新できません:外部キー制約は失敗します( 'project'.pri_phy_patient'、CONSTRAINT' pri_phy_patient_ibfk_1' FOREIGN KEY( 'phy_ssn')REFERENCES' doctor'( 'ssn'))' ' – doy

+0

あなたは**患者テーブルに**データを挿入していますか?挿入時に 'phy_ssn'に有効な値を指定していますか? –

答えて

0

「外部キー」という用語は、あなたにとってはあまり明確ではないと思います。

私はそれを説明しようとしましょう。外部キーは、別のテーブルの主キーを参照するフィールドです。

のは、この例を確認してみましょう:

  • 表1:ブック(ID、タイトル、AuthorId)
  • 表2:このシナリオでは著者(AuthorId、名前、性別)

、表Bookの列AuthorIdは、表Authorsの列AuthorIdを参照しています。

ここであなたのケースに戻りましょう。テーブルpri_phy_patientのカラムphy_ssnは、テーブル医師のカラムssnを参照していますが、ヌルにすることができるため、NULLにすることができます。それはすべての医者ssnsを含むべきではありません。

希望すると便利です。

+0

どのようにして 'doctor(ssn)'と 'pri_phy_patient(phy_ssn)'を "つなぐ"ことが分かりますか?私は 'phy_ssn'を' NOT NULL'にしようとしましたが、それはただエラーを投げただけです。 – doy

+0

フィールドphy_ssnにすでにNull値があるため、エラーが発生している可能性があります。フィールド値をNot Null値に更新してから、フィールドphy_ssn Not Nullを作成してください。 –

+0

これが何を意味するのか分かりません。私はすでにSQLスクリプトを実行するときに私が以前作成したすべてのテーブルをドロップするので、SQLスクリプトを実行するたびに、各テーブルは新鮮なテーブルになります。 'phy_ssn CHAR(11)'の後に 'NOT NULL 'を置くべきではありません。 – doy

関連する問題