2

私はデータベース設計に不慣れで、リレーショナルデータベースを作成する方法についていくつか質問があります。

いくつか質問があります。

接続Table ATable Bて外部キーを使用します。どこでキーを作成しますTable AB

私がテーブルUsersRanks持っていて、1:1の関係にあるとしましょう。

Usersテーブル:

    CREATE TABLE [dbo].[Users](
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [Email] [nvarchar](89) NOT NULL,
    [Name] [nvarchar](25) NOT NULL,
    [Midname] [nvarchar](25) NOT NULL,
    [Surname] [nvarchar](25) NOT NULL,
    [Phone] [varchar](15) NOT NULL,
    [Country] [smallint] NOT NULL,
    [Manager] [nvarchar](89) NOT NULL,
    [Referrer] [nvarchar](89) NOT NULL,
    [Rank] [tinyint] NOT NULL,
       CONSTRAINT [PK_UsersID] PRIMARY KEY CLUSTERED 
       ([Email] ASC)
    )

Ranksテーブル:

    CREATE TABLE [dbo].[Ranks](
    [ID] [tinyint] IDENTITY(1,1) NOT NULL,
    [Rank] [nvarchar](50) NOT NULL,
      CONSTRAINT [PK_Rank] PRIMARY KEY CLUSTERED 
      ([ID] ASC)
    )

私はそれらに参加したい:

Users.Rank ON Rank.ID

しかし、キーを作成することはできません。次のようなエラーが発生します。

Microsoft SQL Server Management Studio

テーブル'Users'の列が、既存の主キーまたはUNIQUE制約と一致しません。

なぜ主キーについて教えてくれるのですか?外部キーを使用しているプラ​​イマリに触れていません。PKとFKが関連している理由がわかりません。

私が間違っていることを説明していただけますか?

ありがとう!

4

3 に答える 3

3

これを使用して外部キーを作成できます。

ALTER TABLE dbo.Users ADD CONSTRAINT
    FK_Users_Ranks FOREIGN KEY
    (
    Rank
    ) REFERENCES dbo.Ranks
    (
    ID
    )

次のように参加します。

select
    *
    from Users           u 
        INNER JOIN Ranks r ON u.rank=r.id

IDENTITY(1,1)Ranks.ID からを削除することをお勧めします。値 (tinyint) が非常に少ないため、ID を自分で管理することをお勧めします。10、20、30、40 の ID を持つランクを挿入できます。後で必要に応じて、10 から 20 の間に新しいものを含める必要がある場合は、15 を追加できます。ID があると、ロックインされます。

現在テーブルにデータがあり、FK を追加しようとする場合は、FK を追加する前に、すべての Users.Rank 値が Rank.ID 内に存在することを確認してください。

于 2012-05-31T13:17:54.063 に答える
1

Users.Rank ON Rank.IDこれは正しいですが、Users.Rank が int の場合、Rank.ID も int にする必要があります。そうしないと、エラーが発生します。

個人の主キーは、たとえば、個人 ID、電子メール、名前 + 姓 + 年齢などですが、データベースでは、この ID は多くの場合整数型です。person テーブルがある場合は、 personid、name、lastname などの列が必要です。

その personid を別のテーブルで使用すると、外部キーになります。例のために。電話番号テーブルがある場合、これらの列があります

numberid、prefix、number、およびpersonid - 現在、この personid は FK です。FK型=PK型

これは、データベース ダイアグラムで簡単に実行できます。まず、主キー フィールドを手動で外部キー テーブルにドラッグします 主キーフィールドを手で外部キーテーブルにドラッグします

ダイアログを見て[OK]をクリックするより:) enthan ダイアログを見て、[OK] をクリックします :)e

于 2012-05-31T13:09:27.887 に答える
0

「正しい方向」で外部キーを作成していますか? エラーメッセージに基づいて、次のような関係を作成しようとしていると思います:

  • 主キーテーブルをユーザーに、列をランクに選択します
  • 外部キー テーブルをランクに、列を ID に選択します

これは、「キー」Users.Rank が Rank テーブルにエクスポートされることを意味しますが、Users.Rank 列は Users テーブルのキーではないため、これは不可能です。

外部キーは反対方向にある必要があります。

  • 主キー テーブルはランク、列 ID
  • 外部キー テーブルはユーザー、カラム ランクです。

これにより、Users テーブルの多くの行が同じランクを持つことができる一対多のキーが作成されます。本当に 1 対 1 の関係が必要な場合は、Users.Rank 列に一意のインデックス (または制約) を作成する必要があります。

于 2012-06-01T12:25:06.777 に答える