6

私は「メインテーブル」を持っています、それを呼び出しますCustomers

 CREATE TABLE Customers (
     CustomerID int PRIMARY KEY NOT NULL,
     FirstName nvarchar(50),
     LastName nvarchar(50)
 )

ここに画像の説明を入力

そして、私は「サテライトテーブル」を持っています、それを呼び出しますCustomer_IllegallyObtainedInformation

CREATE TABLE Customer_IllegallyObtainedInformation (
    CustomerID int PRIMARY KEY NOT NULL,
    CellPhonePin int,
    SexualOrientation varchar(20),
    EmailPassword varchar(50)
)

ここに画像の説明を入力

今、私が欲しいIllegalのは、テーブルからメインテーブルへの外部キー制約Customersです:

ここに画像の説明を入力

言い換えると:

  • エントリなし可能性がありますCustomer Illegal
  • しかし、_Illegal _Customer

私の本能は、SQL Server データベース ダイアグラムでドラッグすることでした。

  • FROMIllegalテーブルTOCustomersテーブル_ _

Customers_IllegallyObtainedInformation関係の "子" であるSQL Server を示します。代わりに、その SQL Server で発生することにより、1 対 1 の関係になります。

ここに画像の説明を入力

を挿入しようとするとCustomer、既存の情報がないため失敗することを意味しますIllegal

SQL Server で"Parent-Child"または"One-to-Optional-One"関係を作成するにはどうすればよいですか?


注:例と質問を混同しないでください。Illegalテーブルに犠牲的なプライマリ代理キーを作成できます。

ここに画像の説明を入力

しかし、それは私の質問ではありませんでした。

4

3 に答える 3

8

設計者が反対方向に外部キーを作成しているようです。

自分でコーディングするだけです。

 CREATE TABLE Customers (
         CustomerID int PRIMARY KEY NOT NULL,
         FirstName nvarchar(50),
         LastName nvarchar(50)
     )

    CREATE TABLE Customer_IllegallyObtainedInformation (
        CustomerID int PRIMARY KEY NOT NULL,
        CellPhonePin int,
        SexualOrientation varchar(20),
        EmailPassword varchar(50),

        constraint fk_Customers foreign key (CustomerId) references dbo.Customers
    )

    -- succeeds:
    insert into dbo.Customers
        values(1, 'One', 'One'), (2, 'Two', 'Two')

    --fails:
    insert into dbo.Customer_IllegallyObtainedInformation
        values(3, 1, '', '');

    --succeeds:
    insert into dbo.Customer_IllegallyObtainedInformation
        values(1, 1, '', '');
于 2012-10-31T21:32:58.343 に答える
5

PRIMARY KEY は、アウトバウンドの FOREIGN KEY リレーションに参加できます。

CREATE TABLE Customer_IllegallyObtainedInformation (
    CustomerID int PRIMARY KEY NOT NULL,
    CellPhonePin int,
    SexualOrientation varchar(20),
    EmailPassword varchar(50)
)
ALTER TABLE Customer_IllegallyObtainedInformation ADD FOREIGN KEY (CustomerId)
        REFERENCES Customer(CustomerId)
于 2012-10-31T21:37:11.170 に答える
4

他の人は、SQL スクリプトを使用して関係を設定することで、目的を達成する方法をすでに指摘しています。デザイナーが何をしているかについて数セントを追加するだけだと思いました...

基本的に、間違った方向にドラッグしています。

外部キーは、それ自体で常に 1 対多です。これは、列 (​​または列の組み合わせ) を常に別のテーブルのキーに対応させたいテーブル (子テーブル) があることを DBMS に通知する方法です。この情報を使用して、DBMS は、子テーブルの各行が実際にこの要件を満たしていることを確認する責任を引き継ぐことができます。

列を子テーブルでもキーにすることで、関係を事実上 1 対 1 にすることができますが、DBMS の観点からは、これは実際には関係のプロパティではありません。むしろ、子テーブルに挿入できるデータに対するもう 1 つの制限です。

デザイナでリレーションシップを作成するときに、誰かが主キーを子テーブルにドラッグする必要があると判断したようです。したがって、 Customers_IllegallyObtainedInformation から Customers にドラッグするデザイナーCustomers_IllegallyObtainedInformationが主キーを含むテーブルであると判断します。

しかし待ってください。なぜ、代理キーを導入した 2 番目のサンプルで機能したのでしょうか。おそらく、デザイナーを作っている人たちがスマートにしようと決めたからでしょう。その場合、テーブルのキーではない列をドラッグしています。これは関係の主キーを形成できないため、設計者は反対方向に関係を形成できるかどうかを確認します。そしてそれができるので、それが提供するものです...

于 2012-11-01T09:01:14.073 に答える